Python 羽毛和拼花地板有什么区别?

Python 羽毛和拼花地板有什么区别?,python,pandas,parquet,feather,pyarrow,Python,Pandas,Parquet,Feather,Pyarrow,两者都是数据分析系统中使用的列(磁盘)存储格式。 两者都集成在(python包)中,并且 设计为作为内存分析层中的列对应 两种格式有何不同 如果可能的话,在与熊猫合作时,你是否总是更喜欢羽毛 什么是比和更合适的用例 反过来 附录 我在这里找到了一些提示, 但是考虑到这个项目的年轻,它可能有点过时了 这不是一个严肃的速度测试,因为我只是在倾倒和装载一整辆车 数据帧,但如果你从来没有 以前听说过这些格式: # IPython import numpy as np import panda

两者都是数据分析系统中使用的列(磁盘)存储格式。 两者都集成在(python包)中,并且 设计为作为内存分析层中的列对应

两种格式有何不同

如果可能的话,在与熊猫合作时,你是否总是更喜欢羽毛

什么是比和更合适的用例 反过来


附录

我在这里找到了一些提示, 但是考虑到这个项目的年轻,它可能有点过时了

这不是一个严肃的速度测试,因为我只是在倾倒和装载一整辆车 数据帧,但如果你从来没有 以前听说过这些格式:

 # IPython    
import numpy as np
import pandas as pd
import pyarrow as pa
import pyarrow.feather as feather
import pyarrow.parquet as pq
import fastparquet as fp


df = pd.DataFrame({'one': [-1, np.nan, 2.5],
                   'two': ['foo', 'bar', 'baz'],
                   'three': [True, False, True]})

print("pandas df to disk ####################################################")
print('example_feather:')
%timeit feather.write_feather(df, 'example_feather')
# 2.62 ms ± 35.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_parquet:')
%timeit pq.write_table(pa.Table.from_pandas(df), 'example.parquet')
# 3.19 ms ± 51 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("for comparison:")
print('example_pickle:')
%timeit df.to_pickle('example_pickle')
# 2.75 ms ± 18.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
print('example_fp_parquet:')
%timeit fp.write('example_fp_parquet', df)
# 7.06 ms ± 205 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit df.to_hdf('example_hdf', 'key_to_store', mode='w', table=True)
# 24.6 ms ± 4.45 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
print()

print("pandas df from disk ##################################################")
print('example_feather:')
%timeit feather.read_feather('example_feather')
# 969 µs ± 1.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_parquet:')
%timeit pq.read_table('example.parquet').to_pandas()
# 1.9 ms ± 5.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

print("for comparison:")
print('example_pickle:')
%timeit pd.read_pickle('example_pickle')
# 1.07 ms ± 6.21 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
print('example_fp_parquet:')
%timeit fp.ParquetFile('example_fp_parquet').to_pandas()
# 4.53 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 1 loop each)
print('example_hdf:')
%timeit pd.read_hdf('example_hdf')
# 10 ms ± 43.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

# pandas version: 0.22.0
# fastparquet version: 0.1.3
# numpy version: 1.13.3
# pandas version: 0.22.0
# pyarrow version: 0.8.0
# sys.version: 3.6.3
# example Dataframe taken from https://arrow.apache.org/docs/python/parquet.html
  • 拼花地板格式设计用于长期存储,其中Arrow更适合短期或短暂存储(Arrow可能更适合在1.0.0版本发布后长期存储,因为二进制格式将稳定)

  • 拼花地板比羽毛更昂贵,因为它具有更多的编码和压缩层。Feather是未经修改的原始柱状箭头内存。将来我们可能会在Feather中添加简单的压缩

  • 由于字典编码、RLE编码和数据页压缩,拼花文件通常比羽毛文件小得多

  • Parquet是一种标准的分析存储格式,由许多不同的系统支持:Spark、Hive、Impala、各种AWS服务,将来由BigQuery等。因此,如果您正在进行分析,Parquet是一种很好的选择,可以作为多个系统查询的参考存储格式

您显示的基准测试将非常嘈杂,因为您读取和写入的数据非常小。您应该尝试压缩至少100MB或1GB以上的数据,以获得更多信息基准,请参见


希望这有帮助

是的,“未压缩”将始终是一个选项我注意到您的基准代码中的
生成浮动
函数不能保证
唯一值
。它们只是随机的。n=100米时,我十次跑中有两次重复。只是提到万一有人使用这个函数,应该保证唯一性。@Darkonaut只是想知道。。。压缩的结果是更小的大小,所以将其读入内存会更快。这可能是由于压缩/解压缩而产生的额外处理速度仍然比读取更多字节要快。或者你有我没想到的情况吗?HDF5更通用、更重……大多数时候也慢了很多。@WesMcKinney我注意到你的答案写在2018年。2.3年后,你是否仍然认为箭(羽毛)不适合长期储存(与拼花地板相比)?有没有具体的原因?比如稳定性?格式演变?或