泡菜替代品

时间:2012-03-27 20:38:41

标签: python serialization

我正在尝试序列化一个大的(~10 ** 6行,每行约有20个值)列表,以供我自己稍后使用(因此pickle缺乏安全性并不是一个问题)。

列表的每一行都是一个值元组,派生自某个SQL数据库。到目前为止,我已经看到了datetime.datetime,字符串,整数和NoneType,但我最终可能需要支持其他数据类型。

对于序列化,我考虑了pickle(cPickle),json和纯文本 - 但只有pickle保存了类型信息:json无法序列化datetime.datetime,纯文本有明显的缺点。

但是,对于这么大的数据,cPickle相当慢,我正在寻找更快的替代方案。

有什么建议吗?

谢谢!

8 个答案:

答案 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对象,我通过组合找到了简单,速度和大小的最佳组合:

它比picklecPickle选项高出几个数量级。

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

How to dill (pickle) to file?