2014-05-14 9 views
6

Attualmente sto creando un'applicazione di analisi che gestisce grandi quantità di dati. Un caso tipico sarebbe simile a questo: l'utente seleziona una cartella con circa 600 file di misurazione che contengono ciascuno da 40.000 a 100.000 valori. L'applicazione legge questi valori in un oggetto che funziona internamente come una cache di dati, in modo che i file non devono essere letti su ogni accesso.C'è un modo per comprimere un oggetto in memoria e usarlo in modo trasparente?

Questo funziona molto bene, ma ho notato che il consumo di memoria è molto alto e potrebbe diventare troppo grande. Durante i miei test l'applicazione si è bloccata quando il suo consumo di memoria ha superato i 2 GB di RAM.

La struttura dati che contiene i dati è il più semplice possibile, in pratica consiste solo in alcuni dizionari che contengono i dati in un modo nidificato a 2 livelli, niente di complesso. Mi stavo chiedendo se c'è un modo conveniente di archiviare questo oggetto in una forma compressa nella RAM. So che questo ridurrebbe le prestazioni, ma nel mio caso è assolutamente accettabile.

C'è un modo per fare qualcosa del genere che mi permetta di usare i miei oggetti come al solito? O devo implementare la compressione da solo all'interno del mio oggetto?

Grazie per i vostri pensieri e raccomandazioni!

+2

compilare in 64-bit app per evitare il limite 2G. La maggior parte dei computer ha 4Gb + in questi giorni, no? – dasblinkenlight

+0

C'è anche un limite di 2Gb per oggetto singolo: http://stackoverflow.com/questions/1087982/single-objects-still-limited-to-2-gb-in-size-in-clr-4-0 – nicodemus13

+0

@ nicodemus13 Quello limitato è per oggetto, non per processo. Può essere facilmente evitato usando un tipo personalizzato invece di array/'Lista ' – CodesInChaos

risposta

11

Dipende molto dal tipo di lavoro. Una possibilità è quella di comprimere i tuoi oggetti, conservandoli come un byte[] compresso invece del formato di oggetto grezzo usando un Extension Method.

È possibile combinare che insieme a fare il processo di bit di lavoro x64:

public static byte[] SerializeAndCompress(this object obj) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    using (GZipStream zs = new GZipStream(ms, CompressionMode.Compress, true)) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     bf.Serialize(zs, obj); 
     return ms.ToArray(); 
    } 
} 

public static T DecompressAndDeserialize<T>(this byte[] data) 
{ 
    using (MemoryStream ms = new MemoryStream(data)) 
    using (GZipStream zs = new GZipStream(ms, CompressionMode.Decompress, true)) 
    { 
     BinaryFormatter bf = new BinaryFormatter(); 
     return (T)bf.Deserialize(zs); 
    } 
} 
+1

Idea interessante, grazie! Ci proverò. – Robert

+0

@Robert ha funzionato? – Seabizkit

Problemi correlati