【问题标题】:which is faster for load: pickle or hdf5 in python加载速度更快:python中的pickle或hdf5
【发布时间】:2016-10-22 01:54:17
【问题描述】:

给定一个 1.5 Gb 的 pandas 数据帧列表,哪种格式最适合加载压缩数据: pickle(通过 cPickle)、hdf5 还是 Python 中的其他东西?

  • 我只关心将数据加载到内存中的最快速度
  • 我不关心转储数据,它很慢,但我只做一次。
  • 我不关心磁盘上的文件大小

【问题讨论】:

  • 您是否尝试过在您的特定条件下进行测量?
  • 我猜 pickle 将是转储这些数据的最糟糕的方法之一 :-)。当然,这只是一个猜测。我没有任何硬数据来支持它。说到硬数据,何不做个实验一探究竟呢?
  • 你可能想检查这个comparison...
  • 您可以自己分析此内容,如果您按照您的评论建议进行网络钓鱼以获取建议,那么这明显偏离主题要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是无关紧要的,因为它们往往会吸引固执己见的答案和垃圾邮件。相反,请描述问题以及迄今为止为解决该问题所做的工作。
  • @TadhgMcDonald-Jensen “如果其中一个完全优于另一个,那么您会在发布问题之前找到答案。”通常只是一个奇怪的逻辑。

标签: python pandas numpy dataframe hdf5


【解决方案1】:

更新:现在我会在 Parquet、Feather (Apache Arrow)、HDF5 和 Pickle 之间进行选择。

专业人士和反对人士:

  • 镶木地板
    • 专业人士
      • 最快且受广泛支持的二进制存储格式之一
      • 支持非常快速的压缩方法(例如 Snappy 编解码器)
      • 数据湖/大数据的事实标准存储格式
    • 对比
      • 必须将整个数据集读入内存。您无法阅读较小的子集。解决此问题的一种方法是使用 partitioning 并只读所需的分区。
        • 不支持索引。您无法读取特定行或一系列行 - 您始终必须读取整个 Parquet 文件
      • Parquet 文件是不可变的 - 您无法更改它们(无法追加、更新、删除),只能写入或覆盖 Parquet 文件。嗯,这个“限制”来自大数据,将被视为那里的巨大“专业人士”之一。
  • HDF5
    • 专业人士
      • 支持数据切片 - 能够读取整个数据集的一部分(我们可以处理无法完全放入 RAM 的数据集)。
      • 相对较快的二进制存储格式
      • 支持压缩(虽然压缩比 Snappy 编解码器 (Parquet) 慢)
      • 支持追加行(可变)
    • 对比
  • 泡菜
    • 专业人士
      • 非常快
    • 对比
      • 需要大量磁盘空间
      • 对于长期存储,可能会遇到兼容性问题。您可能需要指定 Pickle 版本才能读取旧的 Pickle 文件。

旧答案:

我只考虑两种存储格式:HDF5 (PyTables) 和Feather

这是我的read and write comparison DF 的结果(形状:4000000 x 6,内存大小 183.1 MB,未压缩 CSV 的大小 - 492 MB)。

以下存储格式的比较:(CSVCSV.gzipPickleHDF5[各种压缩]):

                  read_s  write_s  size_ratio_to_CSV
storage
CSV               17.900    69.00              1.000
CSV.gzip          18.900   186.00              0.047
Pickle             0.173     1.77              0.374
HDF_fixed          0.196     2.03              0.435
HDF_tab            0.230     2.60              0.437
HDF_tab_zlib_c5    0.845     5.44              0.035
HDF_tab_zlib_c9    0.860     5.95              0.035
HDF_tab_bzip2_c5   2.500    36.50              0.011
HDF_tab_bzip2_c9   2.500    36.50              0.011

但对你来说可能会有所不同,因为我所有的数据都是datetime dtype,所以最好与你的真实数据或至少与类似数据进行比较...

【讨论】:

  • 为什么只考虑 HDF5 和 Feather,不考虑 Pickle?你的结果表明它很好,还有压缩泡菜。这不是一个很好的标准选择吗?
  • @THN,如果我没记错的话,我在过去看到了一些错误 - 我不确定是否仍然如此......
  • @PirateApp,多个阅读器本身不应该是问题(IO 可能会受到影响)。我不知道如果单个/多个阅读器尝试读取同时写入的数据会发生什么。应该彻底测试。我会考虑在多用户环境中使用 RDBMS(Oracle、MySQL、PostgreSQL 等)或 Hive、Spark 等之一。
  • @LegitStack,目前我会使用 HDF5 或 Parquet 格式 - 它们都是:1)二进制格式 2)支持压缩 3)长期存储 4)与其他格式相比非常快
  • @PirateApp h5py 包描述了您的用例here;他们称之为单写多读(SWMR)。
猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多