泡菜替代品

Guy*_*ini 22 python serialization

我试图序列化一个大的(~10**6行,每个有~20个值)列表,稍后由我自己使用(因此pickle缺乏安全性不是问题).

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

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

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

有什么建议?

谢谢!

Jak*_*ger 13

只要您没有使用(默认)ASCII协议,Pickle实际上非常快.只需确保使用转储protocol=pickle.HIGHEST_PROTOCOL.

  • 应该注意的是,对于`python3`,默认格式实际上是二进制的,根据文档.http://docs.python.org/3.4/library/pickle.html?highlight=pickle#pickle (2认同)
  • 一个语义上更好的选择是`protocol = pickle.HIGHEST_PROTOCOL` (2认同)
  • 最高协议不断变化,任何负数都使用最高协议。如果你在Python 3.8中保留了最高协议中的某些内容,即4(在3.7中是3),升级到使用协议5作为最高协议的更高版本的Python,你将在反序列化时遇到问题 (2认同)

小智 7

协议缓冲区是一种灵活,高效,自动化的机制,用于序列化结构化数据 - 想想XML,但更小,更快,更简单.

优于XML的优势:

  • 更简单
  • 比小3到10倍
  • 比你快20到100倍
  • 不那么暧昧
  • 生成更易于以编程方式使用的数据访问类

https://developers.google.com/protocol-buffers/docs/pythontutorial


Mar*_*oma 6


Fil*_*vić 5

我认为您应该看看PyTables。它应该非常快,至少比使用RDBMS更快,因为它非常松散并且没有任何读/写限制,而且与酸洗相比,您获得了一个更好的接口来管理数据。