更具体的 875228 欺骗——Python 中的简单数据存储。
我有一个相当大的字典(6 GB),我需要对其进行一些处理。我正在尝试几种文档聚类方法,因此我需要立即将整个内容存储在内存中。我有其他函数可以在这些数据上运行,但内容不会改变。
目前,每当我想到新函数时,我都必须编写它们,然后重新生成字典。我正在寻找一种方法将此字典写入文件,以便我可以将其加载到内存中,而不是重新计算它的所有值。
过于简单化的话,它看起来像这样: {((('单词','列表'),(1,2),(1,3)),(...)):0.0, ....}
我觉得 python 一定有比我更好的方法,通过一些字符串循环查找 : 和 ( 尝试将其解析为字典。
为什么不使用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 中的字典字符串表示非常相似。并且不存在像pickle那样的任何安全问题。但可能比 cPickle 慢。
shelve
、json
、yaml
或其他答案,如其他答案所建议。
shelve
特别酷,因为您可以将 dict
放在磁盘上并仍然使用它。值将按需加载。
但是如果你真的想解析
dict
的文本,并且它只包含 str
ings、int
s 和 tuple
s,就像你所展示的那样,你可以使用 ast.literal_eval
来解析它。它更安全,因为你不能用它评估完整的表达式 - 它只适用于 str
ings、数字、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)}
我建议您使用 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/
它具有简单的文件保存/加载功能,我现在不记得了。
以序列化格式写出它,例如pickle(用于序列化的python标准库模块),或者可能使用JSON(这是一种可以通过评估以再次生成内存表示形式的表示形式)。
SourceForge 的此解决方案仅使用标准 Python 模块:
y_serial.py 模块:: 使用 SQLite 仓库 Python 对象
“序列化 + 持久化 :: 只需几行代码,即可将 Python 对象压缩并注释到 SQLite 中;然后通过关键字按时间顺序检索它们,无需使用任何 SQL。对于数据库来说,用于存储无模式数据的最有用的“标准”模块。”
http://yserial.sourceforge.net
压缩奖励可能会将您的 6GB 字典减少到 1GB。如果您不想存储一系列字典,该模块还包含一个 file.gz 解决方案,考虑到您的字典大小,该解决方案可能更合适。
根据您的要求,这里有一些替代方案:
numpy
以紧凑的形式存储您的纯数据并很好地执行分组/批量操作shelve
就像一个由文件备份的大字典一些第三方存储模块,例如
stash
,存储任意纯数据适当的数据库,例如mongodb 用于毛茸茸的数据或 mysql 或 sqlite 纯数据和更快的检索
对于 Unicode 字符,请使用:
data = [{'key': 1, 'text': 'some text'}]
f = open(path_to_file, 'w', encoding='utf8')
json.dump(data, f, ensure_ascii=False)
f.close()
f = open(path_to_file, encoding="utf8")
data = json.load(f)
print(data)
[{'key': 1, 'text': '一些文本'}]