2011-03-17 25 views
7

Tengo aproximadamente 500 archivos HDF5 cada uno de aproximadamente 1,5 GB.Concatenar una gran cantidad de archivos HDF5

Cada uno de los archivos tiene la misma estructura exacta, que es 7 conjuntos de datos compuestos (int, dobles, dobles) y número variable de muestras.

Ahora quiero concatenar todos estos archivos concatenando cada uno de los conjuntos de datos para que al final tenga un solo archivo de 750 GB con mis 7 datasets.

Actualmente estoy ejecutando un script h5py cuales:

  • crea un archivo HDF5 con los datos correctos de máximo ilimitado
  • abiertas en secuencia todos los archivos
  • cheque cuál es el número de muestras (ya que es variable)
  • redimensionar el archivo global
  • anexar los datos

Esto, obviamente, toma muchas horas, ¿Tiene alguna sugerencia acerca de cómo mejorar esto?

Estoy trabajando en un clúster, así que podría usar HDF5 en paralelo, pero no soy lo suficientemente bueno en C programando para implementar algo yo mismo, necesitaría una herramienta ya escrita.

+0

Una posibilidad es fusionar juntos pares de archivos en tu grupo; reduzca el problema a 250 archivos de 3 GB, luego a 125 archivos de 6 GB, y así sucesivamente. Esto solo ayuda si los archivos parcialmente fusionados proporcionan algún ahorro de tiempo al fusionar los resultados más adelante. – sarnold

+0

@sarnold Estoy trabajando en la tolva en NERSC, la velocidad teórica de E/S es de 25 GB/s, también el sistema de archivos es totalmente paralelo y admite MPI I/O. –

+0

Estaba pensando en leer quizás 3 o 4 archivos a la vez y volver a escribirlos, pero lo mejor sería una utilidad c que explote de alguna manera la E/S mpi. –

Respuesta

8

Descubrí que la mayor parte del tiempo lo dedicaba a cambiar el tamaño del archivo, ya que estaba cambiando el tamaño en cada paso, así que ahora voy primero a través de todos mis archivos y obtengo su longitud (es variable).

Luego creo el archivo global h5 configurando la longitud total a la suma de todos los archivos.

Solo después de esta fase, llené el archivo h5 con los datos de todos los archivos pequeños.

ahora tarda aproximadamente 10 segundos para cada archivo, por lo que debería tomar menos de 2 horas, mientras que antes tardaba mucho más.

1

Me da que responder a esto me da una insignia de necro, pero las cosas han mejorado en esta área recientemente.

En Julia esto lleva unos segundos.

  1. Crear un archivo txt que enumera todas las rutas de archivos hdf5 (puede usar bash para hacer esto de una vez si hay un montón)
  2. En un lazo de leer cada línea del archivo de texto y utilizar label$i = h5read(original_filepath$i, "/label")
  3. concat todas las etiquetas label = [etiqueta etiqueta de $ i]
  4. Entonces acaba de escribir: h5write(data_file_path, "/label", label)

mismo se puede hacer si tiene grupos o archivos HDF5 más complicados.

1

La respuesta de Ashley funcionó bien para mí.Aquí es una implementación de su sugerencia de Julia:

archivo de texto Hacer una lista de los archivos para concatenar en bash:

ls -rt $somedirectory/$somerootfilename-*.hdf5 >> listofHDF5files.txt 

escribir un guión Julia para concatenar varios archivos en un solo archivo:

# concatenate_HDF5.jl 
using HDF5 

inputfilepath=ARGS[1] 
outputfilepath=ARGS[2] 

f = open(inputfilepath) 
firstit=true 
data=[] 
for line in eachline(f) 
    r = strip(line, ['\n']) 
    print(r,"\n") 
    datai = h5read(r, "/data") 
    if (firstit) 
     data=datai 
     firstit=false 
    else 
     data=cat(4,data, datai) #In this case concatenating on 4th dimension 
    end 
end 
h5write(outputfilepath, "/data", data) 

A continuación, ejecute el archivo de script de arriba utilizando:

julia concatenate_HDF5.jl listofHDF5files.txt final_concatenated_HDF5.hdf5 
Cuestiones relacionadas