2016-04-04 50 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,但显然你可以使用你想要的:-)