Tüy ve parke arasındaki farklar nelerdir?


95

Her ikisi de veri analiz sistemlerinde kullanım için sütunlu (disk) depolama formatlarıdır . Her ikisi de entegre edilmiştir Apache Ok ( pyarrow piton paket) ile eşleşecek şekilde tasarlanmıştır Ok sütunlu bir bellek analiz tabaka olarak kullanılır.

Her iki format nasıl farklılık gösterir?

Pandalarla çalışırken her zaman tüyü tercih etmeli misiniz?

Kullanım örnekleri nelerdir tüy göre daha uygundur parke ve başka bir yol turda?


Ek

Burada bazı ipuçları buldum https://github.com/wesm/feather/issues/188 , ancak bu projenin genç yaşı göz önüne alındığında, muhtemelen biraz güncel değil.

Ciddi bir hız testi değil çünkü sadece bütün bir Veri Çerçevesini boşaltıp yüklüyorum, ancak daha önce formatları hiç duymadıysanız size biraz izlenim vermek için:

 # 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

Yanıtlar:


136
  • Parke formatı, Arrow'un daha çok kısa vadeli veya geçici depolama için tasarlandığı uzun vadeli depolama için tasarlanmıştır (Ok, 1.0.0 sürümü gerçekleştikten sonra uzun vadeli depolama için daha uygun olabilir, çünkü ikili format o zaman kararlı olacaktır)

  • Daha fazla kodlama ve sıkıştırma katmanı içerdiğinden, parke yazmak Tüy'den daha pahalıdır. Tüy, değiştirilmemiş, sütunlu Ok hafızasıdır. Gelecekte muhtemelen Feather'a basit sıkıştırma ekleyeceğiz.

  • Sözlük kodlaması, RLE kodlaması ve veri sayfası sıkıştırması nedeniyle, Parquet dosyaları genellikle Tüy dosyalarından çok daha küçük olacaktır.

  • Parquet, analitik için birçok farklı sistem tarafından desteklenen standart bir depolama biçimidir: Spark, Hive, Impala, çeşitli AWS hizmetleri, gelecekte BigQuery tarafından vb. Dolayısıyla, analiz yapıyorsanız, Parquet için referans depolama biçimi olarak iyi bir seçenektir. birden çok sistem tarafından sorgulama

Gösterdiğiniz ölçütler, okuduğunuz ve yazdığınız veriler çok küçük olduğu için çok gürültülü olacak. Daha bilgilendirici karşılaştırmalar elde etmek için en az 100MB veya üzeri 1GB veriyi sıkıştırmayı denemelisiniz, örneğin bkz. Http://wesmckinney.com/blog/python-parquet-multithreading/

Bu yardımcı olur umarım


3
Evet, "sıkıştırılmamış" her zaman bir seçenek olacak
Wes McKinney

1
generate_floatsBurada wesmckinney.com/blog/python-parquet-update referans kodunuzdaki işlevinizin garanti etmediğini fark ettim unique_values. Onlar sadece rastgele. N = 100M ile on çalışmadan ikisinde kopya aldım. Birinin benzersizliğin garanti edilmesi gereken bu işlevi kullanması durumunda bahsetmek.
Darkonaut

1
@Darkonaut sadece merak ediyorum ... sıkıştırma daha küçük boyutta sonuçlanır, bu nedenle belleğe okumak daha hızlı olur. Sıkıştırma / açma işleminden kaynaklanan ekstra işlem, daha fazla bayt okumak zorunda kalmadan daha hızlı olabilir. Yoksa düşünmediğim bir durum mu var?
PascalVKooten

2
HDF5 daha genel ve ağırdır ... ayrıca çoğu zaman çok daha yavaştır.
ivo Welch

4
@WesMcKinney Cevabınızın 2018'de yazıldığını fark ettim. 2.3 yıl sonra, yine de Arrow'un (tüy) uzun vadeli depolama için iyi olmadığını düşünüyor musunuz (Parke ile karşılaştırıldığında)? Belirli bir nedeni var mı? İstikrar gibi mi? biçim evrimi? veya?
HCSF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.