我是一个名为的包的作者klepto
(也是 的作者dill
)。
klepto
旨在以非常简单的方式存储和检索对象,并为数据库、内存缓存和磁盘存储提供简单的字典接口。下面,我展示了将大型对象存储在“目录存档”中,这是一个文件系统目录,每个条目一个文件。我选择序列化对象(速度较慢,但使用dill
,因此您几乎可以存储任何对象),并且我选择了缓存。使用内存缓存使我能够快速访问目录存档,而无需将整个存档保存在内存中。与数据库或文件交互可能会很慢,但与内存交互会很快……您可以根据需要从存档中填充内存缓存。
>>> import klepto
>>> d = klepto.archives.dir_archive('stuff', cached=True, serialized=True)
>>> d
dir_archive('stuff', {}, cached=True)
>>> import numpy
>>> # add three entries to the memory cache
>>> d['big1'] = numpy.arange(1000)
>>> d['big2'] = numpy.arange(1000)
>>> d['big3'] = numpy.arange(1000)
>>> # dump from memory cache to the on-disk archive
>>> d.dump()
>>> # clear the memory cache
>>> d.clear()
>>> d
dir_archive('stuff', {}, cached=True)
>>> # only load one entry to the cache from the archive
>>> d.load('big1')
>>> d['big1'][-3:]
array([997, 998, 999])
>>>
klepto
提供对大量存储的快速灵活的访问,如果存档允许并行访问(例如某些数据库),那么您可以并行读取结果。在不同的并行进程或不同的机器上共享结果也很容易。在这里,我创建了第二个归档实例,指向同一个目录归档。在两个对象之间传递密钥很容易,并且与不同的进程没有什么不同。
>>> f = klepto.archives.dir_archive('stuff', cached=True, serialized=True)
>>> f
dir_archive('stuff', {}, cached=True)
>>> # add some small objects to the first cache
>>> d['small1'] = lambda x:x**2
>>> d['small2'] = (1,2,3)
>>> # dump the objects to the archive
>>> d.dump()
>>> # load one of the small objects to the second cache
>>> f.load('small2')
>>> f
dir_archive('stuff', {'small2': (1, 2, 3)}, cached=True)
您还可以选择不同级别的文件压缩,以及是否要对文件进行内存映射。对于文件后端和数据库后端,有很多不同的选项。但是,界面是相同的。
关于您关于垃圾收集和字典部分编辑的其他问题,两者都可以使用klepto
,因为您可以从内存缓存中单独加载和删除对象,转储,加载,并与存档后端同步,或任何其他字典方法。
在此处查看更长的教程:https ://github.com/mmckerns/tlkklp
klepto
到这里:https : //github.com/uqfoundation