2016-04-04 220 views
0

我想從一個C#控制檯應用程序中的遠程MongoDB實例讀取數據,但不斷得到一個OutOfMemoryException。我試圖從中讀取數據的集合有大約500,000條記錄。有誰看到下面的代碼中的任何問題:C#MongoDB驅動程序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

你真的想要一次獲取所有500k文件嗎?什麼是用例? –

+2

你正試圖將你的整個Persons集合一次寫入內存。你沒有足夠的記憶。您可能需要更受限制的結果集,或者您需要以流式處理方式處理結果。與'ForEachAsync'而不是'ToListAsync' –

+0

@JoachimIsaksson我一次不需要全部500k。目標是將所有記錄獲取到CSV文件。我打算輕微地按摩一些田地。 – degmo

回答

1

這是一個簡單的解決方法:(?INT),你可以使用頁面和.Limit .Skip(?INT)的結果;在totNum你必須使用存儲

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

然後

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*/ 
    } 
} 

我希望這可以幫助... 附註:您的集合中的文檔數量 我在.Skip()和.Limit()中使用了1000,但顯然你可以使用你想要的:-)