フェザーと寄木細工の違いは何ですか? 質問する

フェザーと寄木細工の違いは何ですか? 質問する

どちらも列型(ディスク)ストレージ形式データ分析システムでの使用に適しています。両方ともアパッチアローパイアローPython用のパッケージ)であり、矢印列指向のインメモリ分析レイヤーとして。

両方の形式の違いは何ですか?

パンダを扱うときは、可能な場合は常にフェザーを優先する必要がありますか?

どのようなユースケースがあるのかフェザーより適している寄木細工逆の場合はどうでしょうか?


付録

ここでヒントを見つけましたhttps://github.com/wesm/feather/issues/188ただし、このプロジェクトはまだ新しいため、少し古くなっている可能性があります。

データフレーム全体をダンプしてロードするだけなので、本格的な速度テストではありませんが、これまでこれらの形式について聞いたことがない方のために、印象をお伝えします。

 # 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

ベストアンサー1

  • Parquet 形式は長期保存用に設計されていますが、Arrow は短期または一時的な保存を目的としています (1.0.0 リリース以降はバイナリ形式が安定するため、Arrow は長期保存に適している可能性があります)

  • Parquet は、エンコードと圧縮のレイヤーが多いため、Feather よりも書き込みコストが高くなります。Feather は、変更されていない生の列状 Arrow メモリです。将来的には、Feather に単純な圧縮が追加される可能性があります。

  • 辞書エンコーディング、RLEエンコーディング、データページ圧縮により、ParquetファイルはFeatherファイルよりもかなり小さくなることが多い。

  • Parquet は、Spark、Hive、Impala、さまざまな AWS サービス、将来的には BigQuery など、さまざまなシステムでサポートされている分析用の標準ストレージ形式です。したがって、分析を行う場合、複数のシステムによるクエリの参照ストレージ形式として Parquet は適切な選択肢です。

読み書きしたデータが非常に小さいため、示したベンチマークは非常にノイズが多くなります。より有益なベンチマークを得るには、少なくとも100MBまたは1GB以上のデータを圧縮してみてください。例をご覧ください。http://wesmckinney.com/blog/python-parquet-multithreading/

おすすめ記事