2014-05-14 6 views
6

Ich baue gerade eine Analyse-Anwendung, die große Datenmengen verarbeitet. Ein typischer Fall würde folgendermaßen aussehen: Der Benutzer wählt einen Ordner mit ungefähr 600 Messdateien aus, die jeweils etwa 40.000 bis 100.000 Werte enthalten. Die Anwendung liest diese Werte in ein Objekt, das intern als Datencache fungiert, so dass die Dateien nicht bei jedem Zugriff gelesen werden müssen.Gibt es eine Möglichkeit, ein Objekt im Speicher zu komprimieren und transparent zu verwenden?

Das funktioniert sehr gut, aber mir ist aufgefallen, dass der Speicherverbrauch sehr hoch ist und eventuell zu groß wird. Während meiner Tests stürzte die Anwendung ab, als ihr Speicherverbrauch 2 GB RAM überschritt.

Die Datenstruktur, die die Daten enthält, ist so einfach wie möglich, besteht im Grunde nur aus einigen Wörterbüchern, die die Daten in einer zweistufigen geschachtelten Weise enthalten, nichts komplexes. Ich habe mich gefragt, ob es eine bequeme Möglichkeit gibt, dieses Objekt in komprimierter Form im RAM zu speichern. Ich weiß, dass dies die Leistung beeinträchtigen würde, aber das ist in meinem Fall völlig akzeptabel.

Gibt es eine Möglichkeit, so etwas zu tun, dass ich meine Objekte wie gewohnt benutzen kann? Oder muss ich die Komprimierung selbst in meinem Objekt implementieren?

Vielen Dank für Ihre Gedanken und Empfehlungen!

+2

Compile in 64-Bit-Anwendung, die 2G Grenze zu vermeiden. Die meisten Computer haben 4Gb + in diesen Tagen, nein? – dasblinkenlight

+0

Es gibt auch eine Ein-Objekt-2Gb-Grenze: http://StackOverflow.com/Questions/1087982/SingleObjects-Still-Limited-to-2-Gb-in-Size-in-CLR-4-0 – nicodemus13

+0

@ nicodemus13 Das begrenzt ist pro Objekt, nicht pro Prozess. Es kann leicht vermieden werden, indem ein benutzerdefinierter Typ anstelle von Array/'List ' – CodesInChaos

Antwort

11

Es hängt wirklich von der Art ab, mit der Sie arbeiten. Eine Möglichkeit besteht darin, Ihre Objekte zu komprimieren und sie als komprimierte byte[] anstelle des Rohobjektformats mit einer Extension Method zu halten.

könnten Sie kombinieren, dass Ihr Prozess Arbeit x64 Bit zusammen mit machen:

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

Interessante Idee, danke! Ich werde das versuchen. – Robert

+0

@Robert hat es funktioniert? – Seabizkit

Verwandte Themen