2016-04-04 18 views
0

リモートのMongoDBインスタンスからC#コンソールアプリケーションからデータを読み込もうとしていますが、OutOfMemoryExceptionが引き続き発生しています。データを読み込もうとしているコレクションには、約50万レコードがあります。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コレクション全体を一度にメモリに収めようとしています。十分な記憶がありません。より拘束された結果セットが必要な場合や、結果をストリーミングで処理する必要がある場合'ToListAsync'ではなく' ForEachAsync'で –

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

を使用して、コレクション内のドキュメントの数を格納する必要が... P.S. 私は1000を.Skip()と.Limit()で使用しましたが、明らかにあなたが望むものを使うことができます:-)

関連する問題