我正在尝试序列化一个大的(~10 ** 6行,每行约有20个值)列表,以供我自己稍后使用(因此pickle缺乏安全性并不是一个问题)。
列表的每一行都是一个值元组,派生自某个SQL数据库。到目前为止,我已经看到了datetime.datetime,字符串,整数和NoneType,但我最终可能需要支持其他数据类型。
对于序列化,我考虑了pickle(cPickle),json和纯文本 - 但只有pickle保存了类型信息:json无法序列化datetime.datetime,纯文本有明显的缺点。
但是,对于这么大的数据,cPickle相当慢,我正在寻找更快的替代方案。
有什么建议吗?
谢谢!
答案 0 :(得分:13)
只要您没有使用(默认)ASCII协议,Pickle实际上非常快。只需确保使用protocol=pickle.HIGHEST_PROTOCOL
转储。
答案 1 :(得分:6)
协议缓冲区是一种灵活,高效,自动化的机制 序列化结构化数据 - 想想XML,但更小,更快,更好 简单。
优于XML的优势:
- 更简单
- 小3到10倍
- 快20到100倍
- 不那么模糊
- 生成更易于以编程方式使用的数据访问类
https://developers.google.com/protocol-buffers/docs/pythontutorial
答案 2 :(得分:4)
我认为你应该给PyTables看看。它应该是非常快,至少比使用RDBMS更快,因为它非常宽松并且不会施加任何读/写限制,而且您可以获得更好的数据管理界面,至少与酸洗相比。
答案 3 :(得分:3)
答案 4 :(得分:1)
我通常序列化为纯文本(* .csv)因为我发现它是最快的。 csv 模块运行良好。见http://docs.python.org/library/csv.html
如果必须处理字符串的unicode,请查看最后的UnicodeReader和UnicodeWriter示例。
如果您序列化以供将来使用,我想只需知道每个csv列具有相同的数据类型(例如,字符串始终位于第2列)。
答案 5 :(得分:1)
对于数十万个简单(兼容JSON的)复杂Python对象,我通过组合找到了简单,速度和大小的最佳组合:
它比pickle
和cPickle
选项高出几个数量级。
with gzip.open(filename, 'wb') as f:
ubjson.dump(items, f)
with gzip.open(filename, 'rb') as f:
return ubjson.load(f)
答案 6 :(得分:0)
Avro似乎是有前途且经过适当设计的解决方案,但仍不受欢迎。
答案 7 :(得分:0)
仅出于完整性考虑-还有dill
库扩展了pickle
。