2014-05-14 11 views
6

Şu anda büyük miktarda veriyi işleyen bir analiz uygulaması yapıyorum. Tipik bir durum şöyle görünür: kullanıcı, her biri yaklaşık 40.000 ila 100.000 değer içeren yaklaşık 600 ölçüm dosyası içeren bir klasör seçer. Uygulama, bu değerleri dahili olarak bir veri önbelleği olarak çalışan bir nesneye okur, böylece dosyalar her erişimde okunmamalıdır.Bir nesneyi bellekte sıkıştırmanın ve onu saydam olarak kullanmanın bir yolu var mı?

Bu çok iyi çalışıyor, ancak bellek tüketiminin çok yüksek olduğunu ve sonuçta çok büyük olabileceğini fark ettim. Testlerimde, bellek tüketimi 2GB RAM'i aştığında uygulama çöktü.

Verileri tutan veri yapısı olabildiğince basittir, temelde yalnızca 2 düzeyli yuvalanmış bir şekilde veri içeren bazı sözlüklerden oluşur, hiçbir şey karmaşık değildir. Bu nesneyi RAM'da sıkıştırılmış bir biçimde saklamanın uygun bir yolu olup olmadığını merak ediyordum. Bunun performansın düşeceğini biliyorum, ama bu benim durumumda tamamen kabul edilebilir.

Nesnelerimi her zamanki gibi kullanmama izin veren bir şey yapmanın bir yolu var mı? Ya da kendi başıma kendi başıma sıkıştırma uygulamak zorunda mıyım?

Düşünceleriniz ve önerileriniz için teşekkür ederiz!

+2

derleme'yi 2G sınırını önlemek için:

Sen süreç işler x64 bit alma ile birlikte olduğunu birleştirebilirsiniz. Çoğu bilgisayar bugünlerde 4Gb + var, değil mi? – dasblinkenlight

+0

Ayrıca tek bir nesne 2Gb sınırı vardır: http://stackoverflow.com/questions/1087982/single-objects-still-limited-to-2-gb-in-size-in-clr-4-0 – nicodemus13

+0

@ nicodemus13 Bu işlem başına değil, nesne başına sınırlıdır. Dizi/'Liste ' – CodesInChaos

cevap

11

Gerçekten çalıştığınız türün türüne bağlıdır. Bir olasılık nesnelerinizi sıkıştırmak, Extension Method kullanarak ham nesne formatı yerine sıkıştırılmış bir byte[] olarak tutmaktır. 64 bit uygulamasına

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

İlginç bir fikir, teşekkürler! Onu deneyeceğim. – Robert

+0

@Robert işe yaradı mı? – Seabizkit

İlgili konular