2013-01-15 28 views
6

Sto scrivendo un gran numero di piccoli set di dati su un file HDF5 e il file risultante è circa 10x quello che mi aspetterei da una ingenua tabulazione dei dati che sto inserendo. I miei dati sono organizzati gerarchicamente come segue:Overhead storage HDF5

group 0 
    -> subgroup 0 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    -> subgroup 1 
     -> dataset (dimensions: 100 x 4, datatype: float) 
     -> dataset (dimensions: 100, datatype: float) 
    ... 
group 1 
... 

Ogni sottogruppo deve assumere 500 * 4 byte = 2000 byte, ignorando in testa. Non memorizzo alcun attributo accanto ai dati. Eppure, durante i test, trovo che ogni sottogruppo occupa circa 4 kB, o circa il doppio di quanto mi aspetterei. Capisco che ci sia un sovraccarico, ma da dove viene e come posso ridurlo? È nel rappresentare la struttura del gruppo?

Ulteriori informazioni: Se aumento le dimensioni dei due set di dati in ogni sottogruppo su 1000 x 4 e 1000, ciascun sottogruppo occupa circa 22.250 byte, anziché i 20.000 byte piatti che mi aspetto. Ciò implica un sovraccarico di 2,2 kB per sottogruppo ed è coerente con i risultati ottenuti con le dimensioni del set di dati più piccole. C'è un modo per ridurre questo sovraccarico?

+3

Il formato di file HDF5 è [estremamente complesso] (http://www.hdfgroup.org/HDF5/doc/H5.format.html). Usa il blocco interno per memorizzare dati e oggetti di metadati. La dimensione di blocco predefinita per i metadati è 2 KiB e ciascun (sotto) gruppo ha il proprio spazio di intestazione, che spiega la differenza osservata di circa 2000 byte. Potresti provare a sperimentare con l'archiviazione 'COMPACT' - vedi (4.5) [qui] (http://www.hdfgroup.org/HDF5/doc1.6/UG/10_Datasets.html) per ulteriori informazioni sulle strategie di archiviazione. –

+2

I numeri che ho dato sopra sono con il set 'COMPACT'. La lezione è di evitare complicate strutture di gruppo che ospitano piccole quantità di dati. Dopo aver combinato tutti i miei set di dati in un array più grande e applicando la compressione, ottengo un rapporto di compressione migliore di 1: 1 (la compressione consente di risparmiare più spazio rispetto all'aggiunta di overhead HDF5). – Thucydides411

+0

@ Thucydides411 il tuo commento è la migliore risposta! Dovresti scriverlo in una risposta e accettarlo. – Simon

risposta

4

Risponderò alla mia domanda. L'overhead coinvolto solo nella rappresentazione della struttura del gruppo è sufficiente per non aver senso archiviare piccoli array o disporre di molti gruppi, ciascuno contenente solo una piccola quantità di dati. Non sembra esserci alcun modo per ridurre l'overhead per gruppo, che ho misurato a circa 2,2 kB.

Ho risolto questo problema combinando i due dataset di ciascun sottogruppo in un set di dati (100 x 5). Quindi, ho eliminato i sottogruppi e unito tutti i set di dati di ciascun gruppo in un set di dati 3D. Quindi, se avessi precedentemente N sottogruppi, ora ho un set di dati in ogni gruppo, con forma (N x 100 x 5). Così risparmio l'overhead N * 2.2 kB che era precedentemente presente. Inoltre, poiché la compressione incorporata di HDF5 è più efficace con array più grandi, ora ho un rapporto di compressione migliore di 1: 1, mentre prima il sovraccarico occupava metà dello spazio del file e la compressione era completamente inefficace.

La lezione è di evitare complicate strutture di gruppo nei file HDF5 e di provare a combinare più dati possibili in ogni set di dati.

+1

Sì ... e no. HDF5 è stato creato dagli scienziati per archiviare enormi set di dati. Penso che ossessionare oltre 2Kb sia perdersi il punto. Se sei così limitato nello spazio, questa è probabilmente la libreria sbagliata per te. Vale sempre la pena provare a rendere i dati auto-descrittivi il più possibile, anche se ci vuole qualche Kb per farlo. Puoi costruire strutture di dati "intelligenti", così come puoi scrivere codice "intelligente", ma la legge di Moore è dalla parte di chi scrive codice manutenibile e strutture di dati auto-descrittive. –

+0

Penso di averlo letto nella mia risposta. 2 KB per set di dati è sicuramente un problema se si memorizzano grandi quantità di piccoli set di dati. La mia risposta, sopra, è quella di impacchettare i dati in dataset più grandi, se possibile. Non ho proposto una struttura complicata: un set di dati 3D, in cui ogni asse ha un significato, è piuttosto semplice. – Thucydides411