繁体   English   中英

Python:存储大数据结构

[英]Python: storing big data structures

我目前正在用Python做一个项目,该项目使用相对较大的字典(大约800 MB)。 我试图通过使用泡菜来存储其中一个词典,但是遇到了MemoryError。

在python中保存此类文件的正确方法是什么? 我应该使用数据库吗?

Python标准的扩展模块为持久对象提供了类似dict的界面。 它适用于许多数据库后端,不受RAM的限制。 使用shelve不是直接使用数据库的优点是,大多数现有代码保持原样。 这是以速度为代价(与RAM中的指令相比)和灵活性(与直接与数据库一起使用)为代价的。

与手shelf相反, klepto不需要将整个字典存储在单个文件中(当您只需要一个条目时,使用单个文件进行读写就很慢)。 此外,与shelfklepto可以存储几乎可以放入字典中的任何类型的python对象(您可以存储函数,lambda,类实例,套接字,多处理队列等)。

klepto提供了字典抽象,用于写入数据库,包括将文件系统视为数据库(即将整个字典写入单个文件,或将每个条目写入其自己的文件)。 对于大数据,我经常选择将字典表示为文件系统上的目录,并将每个条目都作为一个文件。 klepto还提供了各种缓存算法(例如mrulrulfu等)来帮助您管理内存中的缓存,并将使用该算法为您进行转储并加载到存档后端。

>>> 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]

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

也许您可以使用sqlite3? 除非您拥有真正的旧版本Python,否则应该可以使用它: https : //docs.python.org/2/library/sqlite3.html

我尚未检查sqlite3的局限性,也不清楚它在您的情况下是否有用,但是值得一试。

当您腌制整个数据结构时,就会受到系统RAM的限制。 但是,您可以分块进行。

streaming-pickle看起来像是一种解决方案,用于腌制比板载内存更大的文件状对象。

https://gist.github.com/hardbyte/5955010

由于它是字典,因此可以将其转换为键值对( [(k, v)] )的列表。 然后,您可以使用所需的任何技术(例如pickle)将每个元组序列化为一个字符串,并将它们逐行存储到文件中。 这样,并行处理,检查文件内容等也变得更加容易。

有一些库可让您使用单个对象进行流传输,但是IMO只会使其变得更加复杂。 只需逐行存储它就可以消除很多麻烦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM