2017-04-21 2 views
0

Je suis actuellement en train d'exécuter une expérience dans laquelle je balaie spatialement une cible et saisis une trace d'oscilloscope à chaque pixel discret. Généralement mes longueurs de trace sont de 200Kpts. Après avoir scanné la totalité de la cible, j'assemble spatialement ces signaux temporels et je rejoue essentiellement un film de ce qui a été scanné. Ma zone de numérisation a une taille de 330 x 220 pixels, de sorte que l'ensemble de données est plus grand que la RAM de l'ordinateur que je dois utiliser. Pour commencer, je sauvegardais chaque trace de l'oscilloscope en tant que tableau numérique, puis, après mon balayage, j'ai terminé le sous-échantillonnage/filtrage, puis j'ai assemblé le film de manière à ne pas rencontrer de problèmes de mémoire. Cependant, je suis maintenant à un point où je ne peux pas sous-échantillonner car un alias se produira et devra donc accéder aux données brutes.Optimisation du jeu de données HDF5 pour la vitesse de lecture/écriture

J'ai commencé à chercher à stocker mon grand bloc de données 3D dans un ensemble de données HDF5 en utilisant H5py. Mon principal problème concerne l'allocation de ma taille de segment. Mes données entrant est perpendiculaire au plan que je voudrais lire dans mes principales options (à ma connaissance) d'écrire mes données sont les suivantes:.

#Fast write Slow read 
    with h5py.File("test_h5py.hdf5","a") as f: 
     dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (1,1,dataLen), dtype = 'f') 
     for i in range(height): 
      for j in range(width): 
       dset[i,j,:] = np.random.random(200000) 

ou

#Slow write Fast read 
    with h5py.File("test_h5py.hdf5","a") as f: 
     dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (height,width,1), dtype = 'f') 
     for i in range(height): 
      for j in range(width): 
       dset[i,j,:] = np.random.random(200000)  

est-il d'une certaine manière, je peux optimiser les deux cas, de sorte qu'aucun d'eux n'est horriblement inefficace à exécuter?

+0

Si vous connaissez la taille des ensembles de données à l'avance, et ne veulent pas utiliser la compression, vous pouvez utiliser le stockage contigu (pas de morceaux). Tu ne peux pas essayer ça? – titusjan

Répondre

0

Vous avez des pièges de performance dans votre code.

  1. Vous utilisez une sorte d'indexation de fantaisie dans la ligne (ne change pas le nombre de tableau lors de la lecture obscurcit/écriture à un HDF5-Dataset.
  2. fixer une taille morceau-cache approprié, si vous n'êtes pas lire ou écrire des morceaux entiers. https://stackoverflow.com/a/42966070/4045774

  3. Réduire la quantité de lecture ou d'écriture des appels à la HDF5- Api.

  4. Choisissez une taille de bloc correspond le (morceaux ne peuvent être entièrement lues/écrites, donc si vous avez seulement besoin d'une partie d'un le reste doit rester dans le cache)

L'exemple suivant utilise la mise en cache par l'API HDF5. Pour configurer une taille de cache correcte, j'utiliserai h5py_cache. https://pypi.python.org/pypi/h5py-cache/1.0.1

Vous pouvez améliorer encore les performances si vous effectuez la mise en cache vous-même.(Lire et écrire des morceaux entiers)

écriture

# minimal chache size for reasonable performance would be 20*20*dataLen*4= 320 MB, lets take a bit more 
with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=500*1024**2) as f: 
    dset = f.create_dataset("uncompchunk",(height,width,dataLen),chunks = (20,20,20), dtype = 'f') 
    for i in range(height): 
     for j in range(width): 
      # avoid fancy slicing 
      dset[i:i+1,j:j+1,:] = expand_dims(expand_dims(np.random.random(200000),axis=0),axis=0) 

Lecture

# minimal chache size for reasonable performance would be height*width*500*4= 145 MB, lets take a bit more 
with h5py_cache.File(h5pyfile, 'r+',chunk_cache_mem_size=200*1024**2) as f: 
    dset=f["uncompchunk"] 
    for i in xrange(0,dataLen): 
     Image=np.squeeze(dset[:,:,i:i+1])