Concaténer un grand nombre de fichiers HDF5

j'ai environ 500 fichiers HDF5 d'environ 1,5 Go chacun.

chacun des fichiers a la même structure exacte, qui est composé de 7 ensembles de données (int,double,double) et le nombre variable d'échantillons.

maintenant je veux concaténer tous ces fichiers en concaténant chacun des ensembles de données de sorte qu'à la fin j'ai un seul fichier de 750 Go avec mes 7 ensembles de données.

actuellement j'exécute un script h5py qui:

  • crée un fichier HDF5 avec les bons ensembles de données de Illimité max
  • ouvrir dans l'ordre tous les fichiers
  • vérifier quel est le nombre d'échantillons (c'est variable)
  • redimensionner le fichier global
  • ajouter les données

cela prend évidemment de nombreuses heures, auriez-vous une suggestion pour améliorer cela?

je travaille sur un cluster, donc je pourrais utilisez HDF5 en parallèle, mais je ne suis pas assez bon dans la programmation C pour mettre en œuvre quelque chose moi-même, j'aurais besoin d'un outil déjà écrit.

9
demandé sur Brian Tompsett - 汤莱恩 2011-03-18 02:39:15

3 réponses

j'ai trouvé que la plupart du temps a été passé à redimensionner le fichier, comme je redimensionnais à chaque étape, donc je suis maintenant aller d'abord à travers tous mes fichiers et obtenir leur longueur (il est variable).

ensuite je crée le fichier global h5file mettant la longueur totale à la somme de tous les fichiers.

seulement après cette phase je remplis le h5file avec les données de tous les petits fichiers.

maintenant, il faut environ 10 secondes pour chaque fichier, il devrait donc en moins de 2 heures, alors qu'avant il prenait beaucoup plus.

9
répondu Andrea Zonca 2011-03-21 18:08:32

je comprends que répondre à cela me rapporte un badge nécro - mais les choses se sont améliorées pour moi dans ce domaine récemment.

Dans Julia, cela prend quelques secondes.

  1. créez un fichier txt qui répertorie tous les chemins de fichier hdf5 (vous pouvez utiliser bash pour faire cela en une seule fois s'il y a des lots)
  2. dans une boucle lire chaque ligne du fichier txt et utiliser label$i = h5read(original_filepath$i, "/label")
  3. concat toutes les étiquettes label = [étiquette étiquette de$i]
  4. alors il suffit d'écrire: h5write(data_file_path, "/label", label)

la même chose peut être faite si vous avez des groupes ou des fichiers HDF5 plus compliqués.

1
répondu ashley 2016-02-11 07:34:53

la réponse D'Ashley a bien fonctionné pour moi. Voici une implémentation de sa suggestion dans Julia:

Faire fichier texte énumérant les fichiers à concaténer dans bash:

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

Écrire un script julia pour concaténer plusieurs fichiers en un seul fichier:

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

ensuite, exécutez le fichier de script ci-dessus en utilisant:

julia concatenate_HDF5.jl listofHDF5files.txt final_concatenated_HDF5.hdf5
1
répondu user185160 2016-08-17 17:14:04