which is faster for load: pickle or hdf5 in python
给出了1.5 Gb的pandas数据帧列表。
我想知道哪种方法可以更好地处理加载这些数据:
pickle(通过cPickle),hdf5或python中的其他东西?
首先,"倾销"数据可以花很长时间,我只做一次。
我也不关心磁盘上的文件大小。
题:
我关心的是尽可能快地将数据加载到内存中的速度。
-
您是否尝试过在特定条件下测量?
-
我猜测pickle将是丢弃这些数据的最糟糕方式之一:-)。当然,这只是猜测。我没有任何硬数据来支持它。说到硬数据,为什么不做一个实验并找出答案呢?
-
好吧,我发布一个问题而不是答案我猜;)我可以测试pickle vs hdf5,但如果这个网站上的专家可以指导我一个更好的方法属于"或其他"呢? :)
-
您可能想要查看此比较...
-
您可以自己对此进行分析,如果您根据评论建议进行网络钓鱼以获取建议,则明确偏离主题:要求我们推荐或查找书籍,工具,软件库,教程或其他场外资源的问题不在Stack Overflow的主题,因为它们倾向于吸引固执己见的答案和垃圾邮件。相反,描述问题以及到目前为止已经做了什么来解决它。
-
之前已经提出过这个问题,而且每次达成的共识都非常"完全取决于您的具体数据"。如果一个人比另一个人更好,那么在发布你的问题之前你会找到答案。
-
@ TadhgMcDonald-Jensen"如果一个人比另一个人更好,那么你会在发布问题之前找到答案。"通常只是一个奇怪的逻辑。
-
我只是意味着,如果有一个明确的答案,它不会被关闭作为主题,你会在SO上找到它。
我只考虑两种存储格式:HDF5(PyTables)和Feather
以下是我对DF的读写比较结果(形状:4000000 x 6,内存大小183.1 MB,未压缩CSV大小 - 492 MB)。
以下存储格式的比较:(CSV,CSV.gzip,Pickle,HDF5 [各种压缩]):
1 2 3 4 5 6 7 8 9 10 11
| 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,如果我没记错的话,我过去看到了一些错误 - 我不确定它是否仍然如此......
-
Pickle有一个问题,它不适用于2-3GB的超大数据文件等等。它意味着小数据。泡菜也有安全问题!
-
upvoted!如果多个用户必须并行读取文件而写入是由单个进程完成的
-
@PirateApp,多个读者本身不应该是问题(IO可能会受到影响)。我不知道如果单/多读者会尝试同时读取正在写入的数据会发生什么。它应该彻底测试。我会考虑在多用户环境中使用RDBMS(Oracle,MySQL,PostgreSQL等)或Hive,Spark等。
-
upvoted!感谢分享MaxU,我问的原因是因为我每个自动收报机都有一组ohlc数据,而且我不想一次性加载到内存中,因为它需要大量的数据,我想对每个组进行全表扫描迭代,很好奇,如果hdf5适合sqlite或其他产品,对我来说似乎有点奇怪考虑sql上的全表扫描,我认为这违背了rdbms设计的原则我想,但多用户阅读是必须的
-
@PirateApp,您可能想要阅读此文档
-
@MaxU是HDF5长期存储的东西吗?我知道普通泡菜不是,但如果熊猫本身有一个长期的存储解决方案,这将是很好的。
-
@LegitStack,目前我会使用HDF5或Parquet格式 - 它们都是:1)二进制格式2)支持压缩3)长期存储4)与其他格式相比非常快
-
@PirateApp h5py包描述了你的用例;他们称之为Single Writer Multiple Reader(SWMR)。