【问题标题】:Pickle alternatives泡菜替代品
【发布时间】:2022-02-20 11:23:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您是否考虑将其转储到 SQLite 数据库中?
  • 实际上 - 我没有。可能是最简单的...

标签: python serialization


【解决方案1】:

只要您不使用(默认)ASCII 协议,Pickle 实际上就相当快。只需确保使用protocol=pickle.HIGHEST_PROTOCOL 转储即可。

【讨论】:

  • 应该注意的是,对于python3,默认格式实际上是二进制,根据文档。 docs.python.org/3.4/library/pickle.html?highlight=pickle#pickle
  • 一个语义更好的选择是protocol=pickle.HIGHEST_PROTOCOL
  • 谢谢,@moose!更新自protocol=-1
  • pickle.dump(data, file, protocol=pickle.HIGHEST_PROTOCOL)
  • 最高协议不断变化,任何负数都使用最高协议。如果您在 python 3.8 中的最高协议中保留某些内容,即 4(在 3.7 中为 3),升级到使用协议 5 作为最高协议的某些更高版本的 python,您将在反序列化它时遇到问题
【解决方案2】:

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

相对于 XML 的优势:

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

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

【讨论】:

    【解决方案3】:

    根据您要存储的具体内容,还有其他选择:

    比较的方法是:

    • 易于使用/编程语言支持/工具支持
    • 人类可读
    • 存储大小
    • 阅读时间
    • 写入时间
    • 功能:(1) 追加数据 (2) 读取单行 (3) 具有架构

    【讨论】:

      【解决方案4】:

      我认为你应该给PyTables 看看。它应该快得离谱,至少比使用 RDBMS 快,因为它非常宽松并且不会施加任何读/写限制,而且您可以获得更好的数据管理界面,至少与酸洗相比。

      【讨论】:

        【解决方案5】:

        对于数十万个简单(最多兼容 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】:

        我通常序列化为纯文本 (*.csv),因为我发现它是最快的。 csv 模块运行良好。见http://docs.python.org/library/csv.html

        如果您必须为字符串处理 unicode,请查看最后的 UnicodeReader 和 UnicodeWriter 示例。

        如果您为自己的未来使用而进行序列化,我想知道每个 csv 列具有相同的数据类型就足够了(例如,字符串始终位于第 2 列)。

        【讨论】:

        • 这对我来说不是很好 - 因为它不维护类型信息,我必须循环数据并转换它,这非常慢(至少在我的实现中,使用列表理解列表推导)。
        【解决方案7】:

        为了完整起见 - 还有一个扩展 pickledill 库。

        How to dill (pickle) to file?

        【讨论】:

          【解决方案8】:

          Avro 似乎很有前途,设计得当,但并不流行。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-29
            • 2011-06-10
            • 2014-04-18
            • 2012-04-08
            相关资源
            最近更新 更多