2016-03-07 48 views
0

以下代碼需要5秒鐘才能完成40次迭代。我不認爲這與MongoDb有什麼關係,因爲過濾器應該立即構建,並且應該在這裏進行調用,而不是等待。請讓我知道,如果你看到任何將採取比每次迭代的第二這裏的第1000多種:C# - 運行40次Foreach迭代需要5秒

//There are 40 categories 
foreach (var category in categories) 
{ 
var filter = Builders<BsonDocument>.Filter.In("CurrentOfficeId", officesIds) 
      & Builders<BsonDocument>.Filter.Eq("CategoryId", category.Id); 

if (userId > 0) filter &= Builders<BsonDocument>.Filter.Eq("SubmittedById", userId); 

pendingCallsForItemCountPerCatArray[numberOfCatBeingIterated] = mongoItemsCollection 
                    .Find(filter) 
                    .CountAsync(); 
} 

編輯:請注意,我試圖讓每一個呼叫以前調用完成之前。否則,代碼將如下所示:

callResult[numberOfCatBeingIterated] = await mongoItemsCollection 

編輯2:我證實,呼叫產生Task<long>,而不是長。我也證實,評論掉電話會將迭代次數降到0秒,這是我們知道的,但我只是確認。

+0

你能不能告訴我們這個集合索引? – profesor79

+0

等一下,我錯過了什麼嗎?我的理解是,在下次通話之前,我不會等待電話完成。只是打電話不應該花這麼長的時間...對吧?如果索引開始發揮作用,那麼代碼並沒有達到我想要的效果 - 我稍後等待調用結果,此時我會擔心索引和調用完成時間。 – VSO

+0

休斯敦,我們有一個問題 - >它看起來像我們需要解決這個問題上蒙戈駕駛員側:( – profesor79

回答

1

難道是因爲你總是通過與.Find(過濾器)的mongoItemsCollection迭代?

+0

我懷疑這是在正確的軌道上。是否有FindAsync選項? –

+0

有一個查找異步選項。但是,我會把所有的物品都帶回來。 – VSO

+0

我完全錯過了明顯的,謝謝你們。 – VSO

1

每當代碼是「走很長一段時間」執行 - 這是一個很好的理由,看看有什麼是MongoDB中:-)引擎蓋下。在探查模式

  1. 組蒙戈

db.setProfilingLevel(2,20)

  • 然後檢查發生了什麼事情有
  • db.system.profile.find()。極限(100)的.sort({TS:-1}).pretty()

  • 完成時
  • db.setProfilingLevel(0)

    至於有40個調用一次125毫秒/每調用看起來相當不錯(想象一下,你每個查詢過程中有鎖)

    +0

    我試圖運行查詢異步雖然 - 所以他們應該都相當迅速,即使第一個查詢需要15分鐘才能完成(假設)。編輯:我看到你在說什麼,我很感謝你的回答,分析是非常有用的,但我不認爲這是這裏的問題。 (是的,我知道我可以使用分析創建更高效​​的索引,因爲有時mongo驅動程序不會生成您所期望的查詢)。 – VSO

    +0

    嘗試使用Parallel.ForEach()insted,因爲您仍在等待獲取最後一步的數據 – profesor79

    +0

    我會嘗試一下,但我不明白我是如何等待數據的(當我在等待數據時可能存在差距做TAST myPendingTask = asyncMethod,而不是鍵入myCallResult =等待asyncMethod – VSO