Ho scritto un'applicazione che verifica le prestazioni degli algoritmi evolutivi. Questa applicazione esegue un run dell'algoritmo che consiste in diverse generazioni . I dati prodotti dalla mia applicazione hanno questo aspetto:
run1.run // text file containing metadata
run1_data // folder containing experimental data
-statistics1 // text file containing some specific statistics
-statistics2
-generation0
-generation10 // snapshot of the algorithm at generation10
-generation20
...
Una volta scritti questi dati, non viene mai modificato .
Quando voglio esaminare i dati, la mia applicazione legge il file metadata (.run), apre la directory _data e legge il resto dei dati.
Questo andava bene fino a poco tempo fa. Ora ho centinaia di migliaia di questi file e ho esaurito gli inode sul mio sistema e anche il caricamento dei dati e la copia sono estremamente lenti, anche se ci sono solo pochi gigabyte. I miei dati sembrano essere troppo frammentati, dal momento che i file sono piuttosto piccoli.
La mia applicazione è scritta in C ++ e utilizza la libreria Qt per le operazioni del filesystem. Stavo pensando di usare l'intestazione <system>
per emettere un comando tar
per archiviare i dati dopo aver scritto e non archiviato prima di leggere, ma ho scoperto che tar
deve leggere l'intero archivio per trovare il contenuto. Questo è un problema per me, dato che per risparmiare memoria operativa e tempo a volte carico solo Statistics1
, a volte solo generation10
...
Stavo pensando di cambiare il formato dei miei dati in modo che ci fosse solo un file , che avrebbe qualcosa come un sommario all'inizio, seguito tutti i file di dati concatenati . Il sommario indicherà inizio e fine di ciascun file concatenato. Tuttavia non sono sicuro che questa sia una buona soluzione dato che la classe std::ifstream
che uso per leggere i file non può eseguire salti casuali .
Sono un programmatore principiante e non voglio sprecare molto tempo nello sviluppo di qualcosa che non funziona, quindi chiedo consigli su come risolvere il mio problema.