Dienstag, Februar 18, 2020

Im HDF5 mehr Raum einnimmt als CSV?

Betrachten Sie das folgende Beispiel:

Vorbereiten der Daten:

import string
import random
import pandas as pd

matrix = np.random.random((100, 3000))
my_cols = [random.choice(string.ascii_uppercase) for x in range(matrix.shape[1])]
mydf = pd.DataFrame(matrix, columns=my_cols)
mydf['something'] = 'hello_world'

, Die höchstmögliche Kompression möglich, im HDF5:

store = pd.HDFStore('myfile.h5',complevel=9, complib='bzip2')
store['mydf'] = mydf
store.close()

Speichern auch in CSV:

mydf.to_csv('myfile.csv', sep=':')

Ist das Ergebnis:

  • myfile.csv ist 5,6 MB groß
  • myfile.h5 ist 11 MB groß

Den Unterschied immer größer als die Datensätze größer werden.

Ich habe versucht mit anderen Kompressions-Methoden und-Stufen. Ist das ein bug? (Ich bin mit Pandas 0,11 und die neueste stabile version von im HDF5 und Python).

  • afaik im HDF5 ist entworfen, um zu optimieren-lookup-Zeiten .. nicht die Dateigröße
  • die string-Spalten eine Feste Größe pro Spalte (das ist die max Größe aller Spalten). Lesen Sie über min_itemsize in den docs
  • siehe diese Referenz für meinen obigen Kommentar: pandas.pydata.org/pandas-docs/dev/io.html#string-columns. Zusätzlich. Ihr test ist nur mit ein bisschen Mehraufwand in im HDF5. Dies ist ein sehr strukturiertes Daten; versuchen Sie, die gleiche Sache mit 1M Reihen von Wagen und Sie werden überrascht.
  • Vielen Dank @Jeff. Ich bin immer noch im Widerspruch mit diesem. Die matrix habe ich erstellt hat 100 x 3000= 300,000 float64 – Werte und nur 100 „strings“ und alle halten den gleichen Wert haben, würde ich es mir vorstellen sollte, profitieren von der Kompression. Trotzdem dauert es mehr Platz als in der CSV-Datei, auch wenn ich mit der höchsten Komprimierung möglich. Ist dies zu erwarten?
  • meine Erfahrung war die gleiche wie bei dir – im HDF5 nimmt viel mehr Platz ein als csv-Datei.

1 Kommentar

  1. 39

    Kopie meiner Antwort aus die Frage: https://github.com/pydata/pandas/issues/3651

    Ihre Probe wirklich zu klein. Im HDF5 hat eine ganze Menge overhead mit wirklich kleinen Größen (auch 300k Einträge ist auf der kleineren Seite). Das folgende ist keine Kompression auf beiden Seiten. Floats sind wirklich effizienter vertreten im Binär – (, die als text-Darstellung).

    Darüber hinaus im HDF5 ist die Zeile basiert. Sie bekommen VIEL Effizienz, indem Sie mit Tabellen, die sind nicht zu breit, aber ziemlich lang. (Daher ist dein Beispiel ist nicht sehr effizient im HDF5 an alle, speichern Sie es umgesetzt in diesem Fall)

    Ich habe routinemäßig Tabellen, die sind 10M+ Zeilen-und query-Zeit in ms. Auch das Beispiel weiter unten ist klein. Mit 10+GB-Dateien ist durchaus üblich (und nicht zu vergessen die Astronomie Jungs, die 10GB+ ist ein paar Sekunden!)

    -rw-rw-r--  1 jreback users 203200986 May 19 20:58 test.csv
    -rw-rw-r--  1 jreback users  88007312 May 19 20:59 test.h5
    
    In [1]: df = DataFrame(randn(1000000,10))
    
    In [9]: df
    Out[9]: 
    <class 'pandas.core.frame.DataFrame'>
    Int64Index: 1000000 entries, 0 to 999999
    Data columns (total 10 columns):
    0    1000000  non-null values
    1    1000000  non-null values
    2    1000000  non-null values
    3    1000000  non-null values
    4    1000000  non-null values
    5    1000000  non-null values
    6    1000000  non-null values
    7    1000000  non-null values
    8    1000000  non-null values
    9    1000000  non-null values
    dtypes: float64(10)
    
    In [5]: %timeit df.to_csv('test.csv',mode='w')
    1 loops, best of 3: 12.7 s per loop
    
    In [6]: %timeit df.to_hdf('test.h5','df',mode='w')
    1 loops, best of 3: 825 ms per loop
    
    In [7]: %timeit pd.read_csv('test.csv',index_col=0)
    1 loops, best of 3: 2.35 s per loop
    
    In [8]: %timeit pd.read_hdf('test.h5','df')
    10 loops, best of 3: 38 ms per loop

    Ich wirklich würde nicht sorgen über die Größe (ich vermute, Sie sind nicht, sondern sind lediglich daran interessiert, was in Ordnung ist). Der Punkt, der im HDF5 ist, die Festplatte ist Billig, cpu ist Billig, aber man kann nicht alles haben im Speicher auf einmal so optimieren wir mit chunking

Kostenlose Online-Tests