1分ごとに100,000件以上のドキュメントのフィールドを更新する必要があり、i7、6GB RAM、SSD HD PC上の現在のコードがほぼ 。私の知る限り、あなたがここでドライバー(私はNuget経由から最新のを実行しています)MongoDB C#ドライバ - 多くのドキュメントを更新する際のパフォーマンスの問題
でバッチ更新を行うことはできません理解し、私は以下のように自分のコードを実行することによって得られた結果(25,000の更新を実行するための時間)である:
-
= 151秒予め充填されたコレクションで索引付けと
- プレ充填コレクション= 6.5秒
- プレフィルインデックスとFindOneAndReplaceAsync方法で= 20秒の起動空のコレクションから開始
- = 152秒
インデックス作成が最適に機能し、asyncの効率が低い理由がわかりません。将来、インデックス作成でも10万回以上更新すると、この方法が遅すぎる可能性があります。
これはFindOneAndReplaceAsyncの予想される動作ですか、そうであればパフォーマンスが向上する別の方法があります。 MongoDBで何かしようとしていますか?
コード(準備MCVE):
public class A
{
public A(string id)
{
customId = id;
TimeStamp = DateTime.UtcNow;
}
[BsonId]
[BsonIgnoreIfDefault]
ObjectId Id { get; set; }
public string customId { get; set; }
public double val { get; set; }
public DateTime TimeStamp { get; set; }
}
class Program
{
static IMongoCollection<A> Coll = new MongoClient("mongodb://localhost").GetDatabase("Test").GetCollection<A>("A");
static FindOneAndReplaceOptions<A,A> Options = new FindOneAndReplaceOptions<A, A> { IsUpsert = true, };
static void SaveDoc(A doc)
{
Coll.FindOneAndReplace(Builders<A>.Filter.Where(x => x.customId == doc.customId), doc, Options);
}
static void Main(string[] args)
{
var docs = Enumerable.Range(0, 25000).Select(x => new A(x.ToString()));
Stopwatch sw = new Stopwatch();
sw.Start();
docs.ToList().ForEach(x => SaveDoc(x));
sw.Stop();
Debug.WriteLine(sw.ElapsedMilliseconds);
}
}
ありがとうございます。これは文書がまだ挿入されていない場合は挿入しますか? – Pierre
'Upsert'オプションが必要です。この場合、 'ReplaceOneModel <>'がより適しています。 'operations.Add(新しいReplaceOneModel (ビルダー .Filter.Where(X => x.customId == doc.customId)、DOC1)){IsUpsert = TRUE;}'私は満足することが私の答えを編集 – kreig
あなたの要件。 – kreig