2017-09-21 6 views
0

J'ai un jeu de données relativement volumineux (environ 8 Go) et je l'ai lu dans un bloc-notes jupyter en utilisant h5py.Stockez uniquement les données 'colonne' dans h5py sans les charger dans le fichier de données complet

La forme de l'ensemble de données finit par être quelque chose comme (50000000, 384). Mon ensemble de données idéal aurait cette transposée, de sorte que je peux regarder chaque «colonne» dans l'ensemble de données. La seule façon que j'ai pu obtenir pour obtenir chaque 'colonne' est d'indexer chaque colonne (ce qui est très lent et très gourmant en ressources processeur parce qu'elle va ligne par ligne dans les 50000000 lignes) ou de convertir les données h5 en np.array et transposer cela - qui est également très lent et inefficace.

Par exemple, j'ai un fichier h5:

chunk_file = h5py.File(chunk_fil_1, "r") 

chunk_file["ex_dat"] 

sortie:

HDF5 dataset "ex_dat": shape (50000000, 384) 

Si je fais ceci:

len(chunk_file["ex_dat"][0]) 

sortie:

384 

C'est là que je voudrais que toutes les sorties 50000000 de la colonne «0e».

Existe-t-il un moyen efficace d'indexer un fichier h5 pour des données de type 'colonne' sans lire chaque ligne? Ou d'autres alternatives pour lire ce grand ensemble de données? Mon but final est de stocker des «colonnes» individuelles dans un cadre de données pandas.

+0

Que signifie 'arr = chunk_file [ "ex_dat"] [:, 0]' faire? Je m'attends à ce qu'il lise la colonne 0. Il sera plus lent que de lire 'chunk_file [" ex_dat "] [0,:]', mais devrait rester raisonnable. – hpaulj

+0

Voulez-vous un 'Dataframe' avec 384 colonnes, et les 50 ... lignes? Vous aurez juste lu le tout. – hpaulj

Répondre

0

Donc chunk_file['ex_dat'] est un tableau numpy de forme (50000000, 384). L'indexer avec un entier saisit automatiquement une ligne, ce qui est le comportement attendu. Pour saisir une colonne au lieu d'une ligne dans un tableau numpy, index tout comme

chunk_file['ex_dat'][:,0]

: est « toutes les lignes » et 0 est la première colonne. Ceci est exactement la même chose que la transposition de la matrice (array.T avec numpy) puis prendre la première ligne

chunk_file['ex_dat'].T[0]

+0

Bon, cela prend aussi beaucoup de mon CPU - sans doute parce qu'il lit toujours chaque ligne, alors que tout ce dont j'ai besoin, c'est l'info colonne. À moins que j'interprète ce mal, et que ce soit juste un calcul intensif pour chercher le 0e indice dans chaque rangée? – Pierpressure

+0

@Pierpressure, les données sont disposées sur le fichier dans l'ordre «C», rangée par rangée. Donc oui, charger '[:, 0]' signifie qu'il aura sauter 384 éléments pour chaque lecture. Mais il n'y a aucun moyen de contourner cela, étant donné la façon dont les données sont stockées. Si, comme son nom l'indique, les données sont «tronquées», vous pouvez lire des sous-ensembles de lignes pour économiser de la mémoire. Vérifiez les documents 'h5py'. – hpaulj