2016-11-15 1 views
0

Je ne connais pas très bien xarray et j'apprécierais de pouvoir commencer mon projet. Je voudrais créer un jeu de données xarray unique sur disque ou une base de données provenant de nombreux fichiers (1000s) de chromatographie en phase gazeuse - spectrométrie de masse (gcms), un par échantillon. Mon objectif initial est simplement de tracer des superpositions de données provenant d'ensembles arbitraires d'échantillons, de canaux de masse à charge (m/z) et de fenêtres de temps de rétention, et l'indexation et le chargement paresseux de xarray semblent idéaux.Dans xarray, grand ensemble de données sur disque provenant de nombreux petits cdfs

J'ai les données (bizarre) Format cdf du fabricant, un fichier par exemple, et ont converti chacun pandas géants dataframe dans un format comme

  t  14  15  16  17  18  19 \ 
0  271.0 102144.0 14864.0 43584.0 25816.0 82624.0 9992.0 
1  271.1 102720.0 15608.0 42896.0 25208.0 82432.0 10024.0 
2  271.2 101184.0 14712.0 42256.0 24960.0 81472.0 9960.0 
3  271.3 101824.0 14704.0 41216.0 25744.0 83008.0 9984.0 
4  271.4 102208.0 14152.0 41336.0 25176.0 81536.0 10256.0 

où t va jusqu'à 2100,0 sec et les colonnes aller jusqu'à 500 (donc 488 x 18000). J'ai des milliers de tels fichiers, chacun avec un nom d'échantillon différent.

Initialement, je pensais les voir en un seul gros fichier. Ainsi, en suivant les docs, je suis en mesure de créer une structure de Dataset d'un seul échantillon et enregistrez-le Cdf comme suit:

ds1 = xr.Dataset({'intensity': (['time', 'mz'], c1[["{}".format(x) for x in range(14, 501)]].values)}, 
      coords={'mz': range(14, 501), 
        'time': c1['t'].values, 
        'sample':['c1']}) 
ds1.to_netcdf('test_ds1.nc') 


<xarray.Dataset> 
Dimensions: (mz: 487, smp: 1, time: 18185) 
Coordinates: 
    * time  (time) float64 271.0 271.1 271.2 271.3 271.4 271.5 271.6 ... 
    * mz   (mz) int64 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ... 
    * smp  (smp) <U2 'c1' 
Data variables: 
    intensity (time, mz) float64 1.005e+05 1.444e+04 4.162e+04 2.536e+04 ... 

(note mz représente-rapport de masse à charge, qui Comme prévu, le chargement de plusieurs dsi avec xr.open_dataset n'augmente pas l'utilisation mémoire du processus python (je regarde le moniteur d'activité sur mac osx), ce qui est bon.

Cependant, sur l'utilisation en cours d'exécution

d = xr.concat([ds0, ds1], dim='sample') 

mémoire Enregistre jusqu'à ~ 70 Mo/échantillon, ce qui indique que d est entièrement en mémoire, et ce ne sera pas à l'échelle 1000s d'échantillons.

Que puis-je faire dans xarray pour permettre un accès rapide à l'ensemble de données sur le disque? Il semble que xr.concat n'est pas un moyen évolutif de créer un énorme fichier cdf. Peut-être que j'ai besoin d'un moyen de xr.concat directement sur le disque, ou un outil séparé pour combiner les CDD.

Répondre

1

Le chargement différé de Xarray pour combiner plusieurs fichiers netCDF sur le disque nécessite using dask.

Je recommande d'utiliser open_mfdataset qui prend en charge la plupart de ces détails automatiquement, par exemple, xr.open_mfdataset('all/my/files/*.nc', concat_dim='sample').

+0

Fonctionne pour 100 fichiers. En essayant 300 fichiers, j'obtiens 'OSError: [Errno 24] Trop de fichiers ouverts'. –

+0

J'ai pensé à combiner en plus gros morceaux après ouverture de cette façon, par ex. 'ds = xr.open_mfdataset (100 fichiers)' 'ds.to_netcdf (bigfile)' mais l'utilisation de la mémoire commence à monter en flèche immédiatement, donc il faut essayer de charger le tout en mémoire avant d'enregistrer le nouveau fichier cdf. –

+0

L'erreur 'Too many open files' est une erreur que nous connaissons et sur laquelle nous travaillons. Parfois, vous pouvez augmenter la limite sur les fichiers ouverts. Malheureusement, l'auteur de netCDF scipy ne fonctionne pas en core, mais les autres backend netCDF (netcdf4-python et h5netcdf) le feront. – shoyer