在每次迭代时保存pickle对象,而不是每次都写入整个对象

时间:2014-08-05 00:33:19

标签: python pickle

我正在尝试将字典保存为pickle对象。

我的字典在长循环中的每次迭代中变得越来越大,我可以在每次迭代中以有效的方式保存它,这样我只在每次迭代时保存额外的键:值对而不是重新保存整本字典?

示例:

import pickle 

keys = [123,11,2,5]
values = [[10,3,2,1],[0],[1],[2,3],[3]]

for i in range(0,4):
    mydict[keys[i]] = values[i]
pickle.dump(mydict, open('/mydir/mydict.p','w'))

正如我在这里看到的那样,我在循环结束时保存了mydict,但理想情况下我会以有效的方式将它保存在for循环的每个部分。

1 个答案:

答案 0 :(得分:1)

如果您正在寻找能够将大型数据字典保存到磁盘或数据库的东西,并且可以利用酸洗和编码(编解码器和散列图),那么您可能需要查看klepto

klepto提供了用于写入数据库的字典抽象,包括将文件系统视为数据库(即将整个字典写入单个文件,或将每个条目写入其自己的文件)。对于大数据,我经常选择将字典表示为我的文件系统上的目录,并将每个条目都作为文件。 klepto还提供缓存算法,因此如果您使用字典的文件系统后端,则可以通过利用内存缓存来避免速度损失。

>>> from klepto.archives import dir_archive
>>> d = {'a':1, 'b':2, 'c':map, 'd':None}
>>> # map a dict to a filesystem directory
>>> demo = dir_archive('demo', d, serialized=True) 
>>> demo['a']
1
>>> demo['c']
<built-in function map>
>>> demo          
dir_archive('demo', {'a': 1, 'c': <built-in function map>, 'b': 2, 'd': None}, cached=True)
>>> # is set to cache to memory, so use 'dump' to dump to the filesystem 
>>> demo.dump()
>>> del demo
>>> 
>>> demo = dir_archive('demo', {}, serialized=True)
>>> demo
dir_archive('demo', {}, cached=True)
>>> # demo is empty, load from disk
>>> demo.load()
>>> demo
dir_archive('demo', {'a': 1, 'c': <built-in function map>, 'b': 2, 'd': None}, cached=True)
>>> demo['c']
<built-in function map>
>>> 

klepto还有其他标记,例如compressionmemmode,可用于自定义数据的存储方式(例如压缩级别,内存映射模式等)。 使用(MySQL等)数据库作为后端而不是文件系统同样容易(相同的界面)。您还可以关闭内存缓存,因此只需设置cached=False,每次读/写都会直接进入存档。

通过构建自定义klepto

keymap可以自定义您的编码。

>>> from klepto.keymaps import *
>>> 
>>> s = stringmap(encoding='hex_codec')
>>> x = [1,2,'3',min]
>>> s(x)
'285b312c20322c202733272c203c6275696c742d696e2066756e6374696f6e206d696e3e5d2c29'
>>> p = picklemap(serializer='dill')
>>> p(x)
'\x80\x02]q\x00(K\x01K\x02U\x013q\x01c__builtin__\nmin\nq\x02e\x85q\x03.'
>>> sp = s+p
>>> sp(x)
'\x80\x02UT28285b312c20322c202733272c203c6275696c742d696e2066756e6374696f6e206d696e3e5d2c292c29q\x00.' 

klepto还提供了许多缓存算法(如mrulrulfu等),以帮助您管理内存缓存,并且使用算法执行转储并加载到归档后端。

您可以使用标志cached=False完全关闭内存缓存,并直接读写磁盘或数据库。如果您的条目足够大,您可以选择写入磁盘,在其中将每个条目放入其自己的文件中。这是两个例子。

>>> from klepto.archives import dir_archive
>>> # does not hold entries in memory, each entry will be stored on disk
>>> demo = dir_archive('demo', {}, serialized=True, cached=False)
>>> demo['a'] = 10
>>> demo['b'] = 20
>>> demo['c'] = min
>>> demo['d'] = [1,2,3]

然而,这通常会减慢执行速度......通常最好指定内存缓存中保留的最大数量并选择一个好的缓存算法。

在此处获取kleptohttps://github.com/uqfoundation