0
votes

Lecture de gros fichiers HDF5

Je suis nouveau à utiliser des fichiers HDF5 et j'essaie de lire des fichiers avec des formes de (20670, 224, 224, 3) . Chaque fois que j'essaie de stocker les résultats des résultats du HDF5 dans une liste ou une autre structure de données, il faut soit de si longtemps que je abandonne l'exécution ou qui bloque mon ordinateur. Je dois pouvoir lire 3 séries de fichiers HDF5, utiliser leurs données, le manipuler, l'utiliser pour former un modèle CNN et faire des prédictions.

Toute aide pour la lecture et l'utilisation de ces gros fichiers HDF5 seraient grandement appréciés. < / p>

Voici actuellement comment je lis le fichier HDF5: xxx


1 commentaires

Vous devriez essayer de tromper les données pour plus de fois IO.


3 Réponses :


1
votes

Les crashs signifient probablement que vous manquez de mémoire. Comme Vignesh Pillay suggéra, j'essaierais de chunder les données et de travailler sur un petit morceau de celui-ci à la fois. Si vous utilisez la méthode des pandas Read_hdf Vous pouvez utiliser l'itérateur et le chunksize Paramètres pour contrôler le chunking:

import pandas as pd
data_iter = pd.read_hdf('/tmp/test.hdf', key='test_key', iterator=True, chunksize=100)
for chunk in data_iter:
   #train cnn on chunk here
   print(chunk.shape)


0 commentaires

1
votes

Ma réponse mise à jour 2020-08-03 pour refléter le code que vous avez ajouté à votre question. Comme @tober noté, vous manquez de mémoire. La lecture d'un jeu de données de forme (20670, 224, 224, 3) deviendra une liste de 3,1 g entités. Si vous lisez 3 ensembles d'images, cela nécessitera encore plus de RAM. Je suppose que c'est des données d'image (peut-être 20670 images de forme (224, 224, 3))? Si tel est le cas, vous pouvez lire les données dans des tranches avec les deux H5py code> et code> (pytables). Cela rendra les données comme une matrice numpue, que vous pouvez utiliser directement (pas besoin de manipuler dans une structure de données différente).

processus de base ressemblerait à ceci: p>

with h5py.File(os.getcwd() + "/Results/Training_Dataset.hdf5",'r') as db:
     training_db = db['data']
     # loop to get images 1 by 1
     for icnt in range(20670) :
         image_arr = training_db [icnt,:,:,:}

     # then do something with the image


2 commentaires

J'ai ajouté comment je lis et utilise le fichier HDF5. Mon ordinateur a 8 Go de RAM et tout ce que vous avez supposé était correct. Il s'agit de 20670 images avec des formes (224,224,3). Serais-je capable de former le modèle CNN en lots?


J'ai mis à jour ma réponse pour refléter votre code. Remarque: formation_db est un objet de jeu de données H5py qui "se comporte comme" un tableau NUMPY. Cependant, il nécessite beaucoup moins de mémoire que la lecture du contenu du jeu de données dans la mémoire (en tant que liste ou tableau). Je ne connais pas avec CNN, alors ne savez pas comment vous entraîner en lots. J'ai vu d'autres postes comme celui-ci, alors supposez que cela puisse être fait. Franchement, 8 Go de RAM n'est pas beaucoup lorsque vous souhaitez travailler avec de grands ensembles de données.



0
votes

Votre problème provient car vous manquez de mémoire. Ainsi, les jeux de données virtuels sont utiles tout en traitant de grands ensembles de données comme la vôtre. Les jeux de données virtuels permettent de masquer un certain nombre de jeux de données réels dans un seul jeu de données slicable via une couche d'interface. Vous pouvez en savoir plus sur eux ici ici https://docs.h5py.org/fr/stable /vds.html

Je vous recommanderais de commencer à partir d'un fichier à la fois. Premièrement, créez un fichier de jeu de données virtuel de vos données existantes telles que xxx

Ceci créera un jeu de données virtuel de vos données de formation existantes. Maintenant, si vous souhaitez manipuler vos données, vous devez ouvrir votre fichier dans le mode R + comme xxx

une dernière chose que je voudrais conseiller est Assurez-vous que vos indices lors de la tranchée sont de int DataType, sinon vous obtiendrez une erreur.


0 commentaires