2016-04-04 26 views
0

Bir C# konsol uygulamasından uzak bir MongoDB örneğinden veri okumaya çalışıyorum ama bir OutOfMemoryException almaya devam ediyorum. Verileri okumaya çalıştığım koleksiyonun yaklaşık 500.000 kayıtları var.C# MongoDB Sürücü OutOfMemoryException

var mongoCred = MongoCredential.CreateMongoCRCredential("xdb", "x", "x"); 
var mongoClientSettings = new MongoClientSettings 
{ 
    Credentials = new[] { mongoCred }, 
    Server = new MongoServerAddress("x-x.mongolab.com", 12345), 
}; 

var mongoClient = new MongoClient(mongoClientSettings); 
var mongoDb = mongoClient.GetDatabase("xdb"); 
var mongoCol = mongoDb.GetCollection<BsonDocument>("Persons"); 
var list = await mongoCol.Find(new BsonDocument()).ToListAsync(); 
+0

Gerçekten tüm 500k belgeleri bir seferde getirmeye mi çalışıyorsunuz? Kullanım durumu nedir? –

+2

Tüm Kişiler koleksiyonunuzu bir kerede belleğe sığdırmaya çalışıyorsunuz. Yeterli belleğin yok. Ya daha kısıtlı bir sonuç kümesine ihtiyacınız var, ya da sonuçlarınızı akış biçiminde, örn. ToListAsync 'ForLachAsync' yerine ForEachAsync' ile –

+0

@JoachimIsaksson Bir kerede 500k’ya ihtiyacım yok. Amaç, tüm kayıtları bir CSV dosyasına almaktır. Bazı alanlara biraz masaj yapmayı planlıyorum. – degmo

cevap

1

Bu basit bir geçici çözüm:: herkes aşağıdaki kodu ile herhangi bir sorunu görüyor mu (? Int) sayfa can .Limit ve .Skip (? Int) kullanarak sonuçları; totNum size

coll.Count(new BsonDocument) /*use the same filter you will apply in the next Find()*/ 

ve ben bu yardımcı olabilir umut ardından

for (int _i = 0; _i < totNum/1000 + 1; _i++) 
{ 
    var result = coll.Find(new BsonDocument()).Limit(1000).Skip(_i * 1000).ToList(); 
    foreach(var item in result) 
    { 
     /*Write your document in CSV file*/ 
    } 
} 

... Dip not kullanarak koleksiyonunda belgeler numarasını saklamak zorunda 1000 in .Skip() ve .Limit() kullandım, ancak, açıkçası, istediğiniz şeyi kullanabilirsiniz :-)