python - 将 python 对象写入磁盘而不加载到内存中?

标签 python database persistence pickle

我正在运行大量计算,我想一次将其结果保存到磁盘中,因为整个数据太大而无法保存在内存中。我尝试使用 shelve 保存它,但出现错误:

HASH: Out of overflow pages.  Increase page size

我的代码如下。在 python 中执行此操作的正确方法是什么? pickle 将对象加载到内存中。 shelve 支持磁盘写入,但强制使用受键数限制的字典结构。我保存的最终数据只是一个列表,不需要是字典形式。只需要能够一次阅读一项。

import shelve
def my_data():
  # this is a generator that yields data points
  for n in xrange(very_large_number):
    yield data_point

def save_result():
  db = shelve.open("result")
  n = 0
  for data in my_data():
    # result is a Python object (a tuple)
    result = compute(data)
    # now save result to disk
    db[str(n)] = result
  db.close()

最佳答案

如果您使用 klepto 就很容易,它使您能够透明地将对象存储在文件或数据库中。首先,我展示了直接使用存档后端(即直接写入磁盘)。

>>> import klepto
>>> db = klepto.archives.dir_archive('db', serialized=True, cached=False)
>>> db['n'] = 69     
>>> db['add'] = lambda x,y: x+y
>>> db['x'] = 42
>>> db['y'] = 11
>>> db['sub'] = lambda x,y: y-x
>>> 

然后我们重新启动,创建一个到磁盘“数据库”的新连接。

Python 2.7.11 (default, Dec  5 2015, 23:50:48) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import klepto
>>> db = klepto.archives.dir_archive('db', serialized=True, cached=False)
>>> db     
dir_archive('db', {'y': 11, 'x': 42, 'add': <function <lambda> at 0x10e500d70>, 'sub': <function <lambda> at 0x10e500de8>, 'n': 69}, cached=False)
>>> 

或者您可以创建一个使用内存代理的新连接。下面,我只展示了将所需的条目加载到内存中。

Python 2.7.11 (default, Dec  5 2015, 23:50:48) 
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import klepto
>>> db = klepto.archives.dir_archive('db', serialized=True, cached=True)
>>> db
dir_archive('db', {}, cached=True)
>>> db.load('x', 'y')  # read multiple
>>> db.load('add')     # read one at a time
>>> db
dir_archive('db', {'y': 11, 'x': 42, 'add': <function <lambda> at 0x1079e7d70>}, cached=True)
>>> db['result'] = db['add'](db['x'],db['y'])
>>> db['result']
53
>>>

...或者也可以将新条目转储到磁盘。

>>> db.dump('result')
>>>

关于python - 将 python 对象写入磁盘而不加载到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35608378/

相关文章:

javascript - 将文件发送到 api 请求从 python 到 react-native javascript 转换代码

mysql - 将时间戳从 mysql 格式更改为 unix - MYSQL

java - JPA/Hibernate 如何将特定字段从一个实体连接到另一个实体

persistence - 在 Quartz 调度程序中看到异常导致作业无法运行

java - Java中如何保存最后输入的字符串?

python - Matplotlib 散点图 - 去除白色填充

python - 如何在python中使用数字签名算法RSASSA-PSS-2048-SHA256

python - 在 python 中,如何 'if finditer(...) has no matches' ?

python - Python Twisted 的数据库

MySQL,执行选择和过滤结果的查询