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