更具体的875228—Simple data storing in Python欺骗。
我有一个相当大的字典(6 GB),我需要对它进行一些处理。我正在尝试几种文档聚类方法,所以我需要将整个内容同时存储在内存中。我有其他功能可以在这些数据上运行,但内容不会改变。
目前,每当我想到新功能时,我都要编写它们,然后重新生成dict。我正在寻找一种方法将此dict写入文件,以便我可以将其加载到内存中而不是重新计算它的所有值。
过分简化事物看起来像: {((('word','list'),(1,2),(1,3)),(...)):0.0,....}
我觉得python必须有比我更好的方式循环查找一些字符串:和(尝试将其解析为字典。
答案 0 :(得分:60)
为什么不使用python pickle? Python有一个很棒的序列化模块叫做pickle,它很容易使用。
import cPickle
cPickle.dump(obj, open('save.p', 'wb'))
obj = cPickle.load(open('save.p', 'rb'))
泡菜有两个缺点:
如果您使用的是python 2.6,则会有一个名为json的内置模块。它就像泡菜一样简单:
import json
encoded = json.dumps(obj)
obj = json.loads(encoded)
Json格式是人类可读的,与python中的字典字符串表示非常相似。而且没有像泡菜这样的安全问题。但可能比cPickle慢。
答案 1 :(得分:12)
我会根据其他答案的建议使用shelve
,json
,yaml
或其他任何内容。
shelve
特别酷,因为您可以在磁盘上拥有dict
并仍然使用它。值将按需加载。
但是,如果您真的要解析dict
的文字,并且它只包含str
,int
和tuple
就像您展示的那样,您可以使用ast.literal_eval
来解析它。它更加安全,因为您无法使用它来评估完整的表达式 - 它仅适用于str
,数字,tuple
s,list
s,dict
s ,bool
eans和None
:
>>> import ast
>>> print ast.literal_eval("{12: 'mydict', 14: (1, 2, 3)}")
{12: 'mydict', 14: (1, 2, 3)}
答案 2 :(得分:4)
我建议您使用YAML作为文件格式,以便在光盘上修改它
How does it look:
- It is indent based
- It can represent dictionaries and lists
- It is easy for humans to understand
An example: This block of code is an example of YAML (a dict holding a list and a string)
Full syntax: http://www.yaml.org/refcard.html
要在python中获取它,只需easy_install pyyaml。见http://pyyaml.org/
它带有简单的文件保存/加载功能,我记不起这一分钟了。
答案 3 :(得分:0)
以序列化格式写出来,例如pickle(用于序列化的python标准库模块),或者可能使用JSON(这是一种可以被证明可以再次生成内存表示的表示形式)。
答案 4 :(得分:0)
SourceForge上的此解决方案仅使用标准Python模块:
y_serial.py module ::使用SQLite的仓库Python对象
“序列化+持久性::在几行代码中,将Python对象压缩并注释为SQLite;然后通过关键字按时间顺序检索它们,而不使用任何SQL。最有用的”标准“模块,用于存储无模式数据的数据库。“
http://yserial.sourceforge.net
压缩加值可能会将您的6GB字典减少到1GB。如果您不希望商店出现一系列词典,该模块还包含一个file.gz解决方案,根据您的字典大小,该解决方案可能更合适。
答案 5 :(得分:0)
根据您的要求,有以下几种选择:
numpy
以简洁的形式存储您的简单数据并执行群组/群发操作
shelve
就像一个由文件备份的大型字典
某些第三方存储模块,例如stash
,存储任意明文数据
正确的数据库,例如mongodb用于毛发数据或mysql或sqlite普通数据和更快的检索