पंख और लकड़ी की छत के बीच अंतर क्या हैं?


95

डेटा विश्लेषण प्रणालियों में उपयोग के लिए दोनों स्तंभ (डिस्क-) भंडारण प्रारूप हैं। दोनों को अपाचे एरो ( अजगर के लिए पायरो पैकेज) के भीतर एकीकृत किया गया है और एरो के साथ एक स्तंभ-स्मृति विश्लेषिकी परत के रूप में मेल करने के लिए डिज़ाइन किया गया है ।

दोनों प्रारूप अलग-अलग कैसे हैं?

जब संभव हो पांडा के साथ काम करते समय क्या आपको हमेशा पंख पसंद करना चाहिए?

उपयोग के मामले क्या हैं जहां पंख लकड़ी की छत और दूसरे रास्ते से अधिक उपयुक्त है ?


अनुबंध

मुझे यहाँ कुछ संकेत मिले 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

जवाबों:


136
  • लकड़ी की छत प्रारूप लंबी अवधि के भंडारण के लिए डिज़ाइन किया गया है, जहां एरो अल्पकालिक या अल्पकालिक भंडारण के लिए अधिक है (1.0.0 रिलीज होने के बाद लंबी अवधि के भंडारण के लिए तीर अधिक उपयुक्त हो सकता है, क्योंकि बाइनरी प्रारूप तब स्थिर होगा)

  • पंख की तुलना में लकड़ी की छत लिखना अधिक महंगा है क्योंकि इसमें एन्कोडिंग और संपीड़न की अधिक परतें शामिल हैं। पंख असम्बद्ध कच्चे स्तंभ तीर मेमोरी है। हम शायद भविष्य में पंख के लिए सरल संपीड़न जोड़ देंगे।

  • डिक्शनरी एन्कोडिंग, RLE एन्कोडिंग और डेटा पेज कंप्रेशन के कारण, Parquet फाइलें अक्सर Feather फाइलों की तुलना में बहुत छोटी होंगी

  • Parquet एनालिटिक्स के लिए एक मानक भंडारण प्रारूप है जो कई अलग-अलग प्रणालियों द्वारा समर्थित है: Spark, Hive, Impala, विभिन्न AWS सेवाएँ, भविष्य में BigQuery, आदि द्वारा। इसलिए यदि आप एनालिटिक्स कर रहे हैं, तो Parquet एक संदर्भ भंडारण प्रारूप के रूप में एक अच्छा विकल्प है। कई प्रणालियों द्वारा क्वेरी

आपके द्वारा दिखाए गए मानदंड आपके द्वारा लिखे और लिखे गए डेटा के बाद से बहुत शोर करने वाले हैं। आपको कुछ अधिक जानकारीपूर्ण बेंचमार्क प्राप्त करने के लिए कम से कम 100 एमबी या ऊपर से 1GB डेटा को संपीड़ित करने का प्रयास करना चाहिए, उदाहरण के लिए देखें http://wesmckinney.com/blog/python-parquet-multithreading/

उम्मीद है की यह मदद करेगा


3
हां, "असम्पीडित" हमेशा एक विकल्प होगा
वेस मैककिनी

1
मैंने देखा कि generate_floatsयहां आपके बेंचमार्क कोड में आपका कार्य wesmckinney.com/blog/python-parquet-updon गारंटी नहीं देता है unique_values। वे सिर्फ यादृच्छिक हैं। N = 100M के साथ मुझे दस में से दो रन डुप्लिकेट मिले। बस मामले में उल्लेख करते हुए कोई इस फ़ंक्शन का उपयोग करता है जहां विशिष्टता की गारंटी दी जानी चाहिए।
Darkonaut

1
@Darkonaut बस सोच रहा था ... संपीड़न का परिणाम छोटे आकार में होता है, इसलिए इसे मेमोरी में पढ़ने की जल्दी होगी। यह हो सकता है कि कंप्रेसिंग / डीकंप्रेसिंग के कारण अतिरिक्त प्रसंस्करण अभी भी अधिक बाइट्स पढ़ने की तुलना में तेज़ होगा। या क्या आपके पास ऐसी स्थिति है जो मैं नहीं सोच रहा हूं?
पास्कलवूटेन

2
HDF5 अधिक सामान्य और भारी है ... अधिकांश समय बहुत धीमा भी।
20

4
@WesMcKinney मैंने देखा कि आपका उत्तर 2018 में वापस लिखा गया था। 2.3 साल बाद, क्या आपको लगता है कि अरो (पंख) दीर्घकालिक भंडारण के लिए अच्छा नहीं है (Parquet की तुलना करके)? क्या कोई खास वजह है? स्थिरता की तरह? प्रारूप विकास? या?
एचसीएसएफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.