Convertir grandes csv para hdf5

Tengo un radio de 100 metros de la línea de archivo csv (en realidad muchos de los archivos csv independientes) por un total de 84GB. Necesito convertirlo a un HDF5 archivo con un solo flotador conjunto de datos. He utilizado h5py en la prueba sin problemas, pero ahora no puedo hacer el conjunto final de datos sin el funcionamiento de la memoria.

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

Acabo de mirar en pytables, pero no se parece a la matriz de la clase (que corresponde a un HDF5 conjunto de datos) puede ser escrita de forma iterativa. Del mismo modo, pandas ha read_csv y to_hdf métodos en su io_tools, pero no puedo cargar todo el conjunto de datos de una sola vez, de modo que no funcionan. Tal vez usted me puede ayudar a resolver el problema correctamente con otras herramientas en pytables o pandas.

InformationsquelleAutor jmilloy | 2014-11-29

2 Kommentare

  1. 34

    Usar 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 usted necesita para utilizar format='table' en la primera llamada a df.to_hdf para hacer la tabla actualizable. De lo contrario, el formato es 'fixed' por defecto, que es más rápido para la lectura y la escritura, pero se crea una tabla que no puede ser añadido.

    Por lo tanto, puede procesar cada CSV uno a la vez, el uso de append=True para construir el hdf5 archivo. Luego sobrescribir el DataFrame o uso del df para permitir a los viejos DataFrame a ser el recolector de basura.


    Alternativamente, en lugar de llamar a df.to_hdf, usted podría anexar 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
  2. 6

    Esto debería ser posible con PyTables. Usted necesitará utilizar el EArray clase, aunque.

    Como ejemplo, el siguiente es un script que escribí para importar fragmentada de la capacitación de los datos almacenados como .npy archivos en un único .h5 archivo.

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

    Echar un vistazo a la documentación para obtener instrucciones detalladas, pero muy brevemente, la create_earray función toma 1) una raíz de datos o nodo primario; 2) nombre de una matriz; 3) un tipo de átomo; 4) una forma con un 0 en la dimensión que desea ampliar; 5) un descriptor detallado; 6) un filtro de compresión; y 7) el número esperado de filas a lo largo de la ampliable dimensión. Sólo los dos primeros son necesarios, pero probablemente va a utilizar todos los siete en la práctica. La función acepta un par de otros argumentos opcionales así, de nuevo, consulte la documentación para más detalles.

    Una vez creada la matriz, usted puede utilizar su append método en la forma esperada.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea