write with txt readtable read_table read from python pandas hdf5 pytables

python - with - ¿HDF5 toma más espacio que CSV?



save dataframe python (1)

Copia de mi respuesta del problema: https://github.com/pydata/pandas/issues/3651

Su muestra es realmente muy pequeña. HDF5 tiene una gran cantidad de sobrecarga con tamaños realmente pequeños (incluso las entradas de 300k están en el lado más pequeño). Lo siguiente es sin compresión en ninguno de los lados. Los flotantes se representan de manera más eficiente en binario (que como representación de texto).

Además, HDF5 está basado en filas. Obtienes MUCHA eficiencia al tener tablas que no son demasiado anchas, pero son bastante largas. (Por lo tanto, su ejemplo no es muy eficiente en HDF5 en absoluto, almacenarlo transpuesto en este caso)

Rutinariamente tengo tablas que son 10M + filas y los tiempos de consulta pueden estar en el ms. Incluso el siguiente ejemplo es pequeño. Tener archivos de 10 + GB es bastante común (¡sin mencionar a los muchachos de astronomía que tienen 10GB + son unos pocos segundos!)

-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

Realmente no me preocuparía el tamaño (sospecho que no lo eres, pero me interesa, lo cual está bien). El punto de HDF5 es que el disco es barato, la CPU es barata, pero no se puede tener todo en la memoria a la vez, así que optimizamos usando fragmentación

Considere el siguiente ejemplo:

Prepare los datos:

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''

Establezca la compresión más alta posible para HDF5:

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

Guardar también en CSV:

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

El resultado es:

  • myfile.csv tiene 5.6 MB de tamaño
  • myfile.h5 tiene 11 MB de grande

La diferencia crece a medida que los conjuntos de datos se hacen más grandes.

Lo he intentado con otros métodos y niveles de compresión. ¿Es esto un error? (Estoy usando Pandas 0.11 y la última versión estable de HDF5 y Python).