你真的需要它一次加载吗?如果您不需要在内存中的所有内容,而只需要在任何给定时间选择您想要的部分,您可能希望将字典映射到磁盘上的一组文件而不是单个文件……或将字典映射到数据库表。因此,如果您正在寻找可以将大型数据字典保存到磁盘或数据库,并且可以利用酸洗和编码(编解码器和哈希图)的东西,那么您可能需要查看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
还有其他标志,例如compression
和memmode
,可用于自定义数据的存储方式(例如压缩级别、内存映射模式等)。使用(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
还提供了很多缓存算法(如mru
、lru
、lfu
等),帮助您管理内存中的缓存,并将使用该算法为您进行转储和加载到存档后端。
您可以使用该标志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]
然而,虽然这应该会大大减少加载时间,但它可能会稍微减慢整体执行速度……通常最好指定内存缓存中保存的最大数量并选择一个好的缓存算法。您必须使用它来获得满足您需求的正确平衡。
klepto
到这里:https : //github.com/uqfoundation