write txt read_table read from data python csv pandas hdf5 pytables

python - txt - Convierte csv grande a hdf5



pandas txt python (2)

Esto debería ser posible con PyTables. EArray embargo, necesitarás usar la clase EArray .

Como ejemplo, la siguiente es una secuencia de comandos que escribí para importar datos de entrenamiento fragmentados almacenados como archivos .npy en un solo archivo .h5 .

import numpy import tables import os training_data = tables.open_file(''nn_training.h5'', mode=''w'') a = tables.Float64Atom() bl_filter = tables.Filters(5, ''blosc'') # fast compressor at a moderate setting training_input = training_data.create_earray(training_data.root, ''X'', a, (0, 1323), ''Training Input'', bl_filter, 4000000) training_output = training_data.create_earray(training_data.root, ''Y'', a, (0, 27), ''Training Output'', bl_filter, 4000000) for filename in os.listdir(''input''): print "loading {}...".format(filename) a = numpy.load(os.path.join(''input'', filename)) print "writing to h5" training_input.append(a) for filename in os.listdir(''output''): print "loading {}...".format(filename) training_output.append(numpy.load(os.path.join(''output'', filename)))

Eche un vistazo a los documentos para obtener instrucciones detalladas, pero muy brevemente, la función create_earray toma 1) una raíz de datos o un nodo primario; 2) un nombre de matriz; 3) un átomo de tipo de datos; 4) una forma con un 0 en la dimensión que desea expandir; 5) un descriptor detallado; 6) un filtro de compresión ; y 7) un número esperado de filas a lo largo de la dimensión expansible. Solo se requieren los dos primeros, pero probablemente uses los siete en práctica. La función también acepta algunos otros argumentos opcionales; nuevamente, vea los documentos para más detalles.

Una vez que se crea la matriz, puede usar su método de append de la manera esperada.

Tengo un archivo csv de línea 100M (en realidad, muchos archivos csv separados) con un total de 84 GB. Necesito convertirlo a un archivo HDF5 con un único conjunto de datos flotante. Utilicé h5py en las pruebas sin ningún problema, pero ahora no puedo hacer el conjunto de datos final sin que se me acabe la memoria.

¿Cómo puedo escribir en HDF5 sin tener que almacenar todo el conjunto de datos en la memoria? Estoy esperando el código actual aquí, porque debería ser bastante simple.

Solo estaba buscando en las tablas , pero no parece que la clase de matriz (que corresponde a un conjunto de datos HDF5) pueda escribirse de forma iterativa. De forma similar, pandas tiene métodos read_csv y to_hdf en sus io_tools , pero no puedo cargar todo el conjunto de datos al mismo tiempo, así que eso no funcionará. Quizás puedas ayudarme a resolver el problema correctamente con otras herramientas en pytables o pandas.


Use append=True en la llamada a to_hdf :

import numpy as np import pandas as pd filename = ''/tmp/test.h5'' df = pd.DataFrame(np.arange(10).reshape((5,2)), columns=[''A'', ''B'']) print(df) # A B # 0 0 1 # 1 2 3 # 2 4 5 # 3 6 7 # 4 8 9 # Save to HDF5 df.to_hdf(filename, ''data'', mode=''w'', format=''table'') del df # allow df to be garbage collected # Append more data df2 = pd.DataFrame(np.arange(10).reshape((5,2))*10, columns=[''A'', ''B'']) df2.to_hdf(filename, ''data'', append=True) print(pd.read_hdf(filename, ''data''))

rendimientos

A B 0 0 1 1 2 3 2 4 5 3 6 7 4 8 9 0 0 10 1 20 30 2 40 50 3 60 70 4 80 90

Tenga en cuenta que debe usar format=''table'' en la primera llamada a df.to_hdf para hacer que la tabla sea apta. De lo contrario, el formato es ''fixed'' por defecto, que es más rápido para leer y escribir, pero crea una tabla a la que no se puede agregar.

Por lo tanto, puede procesar cada CSV uno a la vez, use append=True para compilar el archivo hdf5. Luego, sobrescriba el DataFrame o utilice del df para permitir que el DataFrame anterior sea un elemento no deseado.

Alternativamente, en lugar de llamar a df.to_hdf , puede agregar a un HDFStore :

import numpy as np import pandas as pd filename = ''/tmp/test.h5'' store = pd.HDFStore(filename) for i in range(2): df = pd.DataFrame(np.arange(10).reshape((5,2)) * 10**i, columns=[''A'', ''B'']) store.append(''data'', df) store.close() store = pd.HDFStore(filename) data = store[''data''] print(data) store.close()

rendimientos

A B 0 0 1 1 2 3 2 4 5 3 6 7 4 8 9 0 0 10 1 20 30 2 40 50 3 60 70 4 80 90