Bilmek istediğin her şeye ulaş

C#'ta 16 milyon dizi nesneli bir Dictionary nesnesini doldurmak istediğimde 6 milyon elemana ulaştığında 'out of memory exception' hatası veriyor. Bunu engellemek için nasıl bir çözüm uygulayabilirim?

Mevzu 6 milyon olmasında değil, sözlük (Python'da dict için kullanılan çeviri, C#ta ne deniyor bilmiyorum) içindeki elemanların boyutları.
En doğru çözüm tüm veriyi bir SQLite bir veritabanına yazmak veya bir MSSQL sunucudan okumak.
Onu yapmak istemiyorsan kayıtları ayrı ayrı (veya gruplar halinde) ikili dosyalara yazarak çalış ve hafızada sadece ilgili veriye erişmek için gerekli alanları tut, diğerlerini diskten oku.
Web projesiyse zaten direkt veritabanıyla çalışmalısın, yoksa sayfaya giren her kullanıcıda sunucu boğulur.
  • Paylaş
Tek karakter bile olsa veriler toplamda epey büyük olacaktır. Aynı anda bir dosyaya veya işi daha da ilerletmek istiyorsan gelişmiş bir veritabanına kayıt ederek ilerlemen daha doğru olacaktır. Yavaşlatacaktır ufak oranda da olsa, ama en mantıklısı bu gibi. . .
  • Paylaş
2

Unluckypod, ya veritabanı ile çalışmak ölüm ya o kadar veriyi kaydetmesi inanılmaz uzun sürüyor...off

16 milyon elemanlı bir diziden bahsediliyorsa mimari bir yanlış vardır. Uygulama tasarımınızı gözden geçirin.
  • Paylaş
O kadar büyük bir veriyi memorye yazman zaman alır ve maliyetli olur. Memory yetmiyor. Verilerini partlara bölmeyi deneyebilirsin. Bir veritabanı kullanman en saglıklı olanı.
  • Paylaş
Web projesiyse ve ekrana basarken kullanıyorsan response. Buffer false yapıp deneyebilirsin ama neden böyle bişey yaptığını anlayamadım, yapmak istediğin şeyi anlatırsan belki daha makul yöntemler önerilebilir
  • Paylaş
1

Unluckypod, aslında deneysel bir şey bu diyebiliriz ve mesela olasılıklarla çalıştığım ve permütasyon elemanlarının veri olarak kullanılması gerektiği durum olduğunda ve bu veriler devamlı ram dan çağrılması gerektiğinde ram bunu karşılamıyor. Yalnız eğer ben bu dictionary de, nesne tutan liste tanımlamazsam(List<classismi>) onun yerine List<int> şeklinde tutarsam, o zaman ram dan çok kazanıyorum ve configuration manager da anycpu yerine x64 belirtirsem ve virtual ram de kullanırsam, biraz daha uzun sürse de işlemler sonuca ulaşıyorum bi şekilde...yani yeni şeyler öğrendim sonuçta bu da bişi.

16 milyon veriyi dizide tutmak mantıksız bir seçim. Bu hata yürütülen kodun izin verilen ram miktarını aştığı anlamına geliyor. Bunun yerine veritabanı kullanabilirsiniz.
  • Paylaş
Sonraki Soru
HESAP OLUŞTUR

İstatistikler

97 Görüntülenme7 Takipçi6 Yanıt