与shelf 不同,klepto 不需要将整个字典存储在单个文件中(当您只需要一个条目时,使用单个文件进行读写非常慢)。此外,与shelf 不同,klepto 可以存储几乎任何类型的 Python 对象,您可以将其放入字典中(您可以存储函数、lambda、类实例、套接字、多处理队列等)。
klepto 为写入数据库提供字典抽象,包括将文件系统视为数据库(即将整个字典写入单个文件,或将每个条目写入其自己的文件)。对于大数据,我经常选择将字典表示为我的文件系统上的一个目录,并让每个条目都是一个文件。 klepto 还提供多种缓存算法(如mru、lru、lfu 等)来帮助您管理您的内存缓存,并将使用该算法进行转储和加载到存档后端给你。
>>> 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,可用于进一步自定义数据的存储方式。使用(MySQL 等)数据库作为后端而不是文件系统同样容易(完全相同的界面)。您可以使用标志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