2016-04-25 30 views
-2

我有以下的算法,將數據寫入到Azure的Blob存儲運行任務的最佳數量是多少?

private const long MaxChunkSize = 1024 * 1024 * 4; // 4MB 

private void UploadPagedDataToBlob(...) 
{ 
    ... 
    List<Task> list_of_tasks = new List<Task>(); 
    do 
    { 
     var stream = new MemoryStream(data, index, (int)blockSize); 
     var task = _blob.WritePagesAsync(stream, startPosition, null); 

     list_of_tasks.Add(task); 
     ... 
    } 
    while (remainingDataLength > 0); 
    Task.WaitAll(list_of_tasks.ToArray()); 
} 

如果我的文件有大小628MB =>則list_of_tasks157任務(628/MaxChunkSize)。通常我有超過1個TB文件。我不想有這麼多的運行任務,如何創建更高效​​的算法?運行任務的最佳數量是多少?例如不超過200,任何建議?

+0

這取決於。遠程系統可能會限制連接,如果CPU處於限制狀態,您可能希望在單個CPU上將其限制爲核心。我們不知道'_blob'是什麼,所以很難回答。一般來說,使用Parallel.For或TPL DataFlow會更好,並讓TPL決定同時運行多少個任務。 –

+0

有段時間我回答了類似的問題。這可能會有所幫助:http://stackoverflow.com/a/32252521/1835769 – displayName

+4

您可以通過實驗確定您的方案的最佳任務數量,而不是我們。設計一個實驗,仔細執行它,你就會知道答案。 –

回答

1

用於將文件依次寫入同一磁盤?

1.

並行性只有在您可以實際並行運行任務時纔有用。你的共同瓶頸是磁盤訪問,如果你同時發出多個寫入,這不會變得更好 - 相反,它可能會變得更慢,並且它傾向於爭取在同一系統上運行的其他事物的優先權。

硬盤驅動器針對順序寫入進行了很好的優化。如果你遇到了吞吐量問題,那就讓你的塊變大一點 - 但並行寫入很可能會傷害你而不是幫助。

如果您正在處理遠程資源,則需要考慮延遲。如果延遲比發送一個塊所需的時間高得多,那麼並行化可能是值得的,以減少「浪費」的時間 - 但是,您還需要確保一切都正確同步,並且沒有任何限制會傷害到您。

+1

不知道這是如何被接受的答案,因爲問題不在於寫入磁盤。這涉及到寫入Azure blob存儲。更具體地說,對於一個頁面blob(假設代碼調用了'WritePagesAsync()')。 Azure Blob存儲設計用於多個同時寫入,並且不像硬盤驅動器那樣進行優化。如果OP正在嘗試同時寫入多個Blob,則它受到每個blob事務和每秒每存儲帳戶交易(加上帶寬)的限制。 –

+0

謝謝,但我正在寫異步地寫入一個具有偏移量的blob。那麼我可以創建多少任務? – Anatoly

+0

@Anatoly這就是我的答案中的「遠程資源」部分 - 找出延遲,看看是否有任何調節,最終,只是嘗試不同的配置,並選擇最好的。 – Luaan

相關問題