2016-04-25 5 views
-2

は、私は私のファイルのサイズが628MBを持っている場合はAzureのブロブストレージに最適な実行タスク数はどれくらいですか?

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()); 
} 

をデータを書き込み、次のアルゴリズムを持っている=>その後、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つのチャンクを送信するのにかかる時間よりもはるかに長い場合は、「無駄な」時間を減らすために並列処理を行う価値があるかもしれませんが、すべてが適切に同期されていることを確認する必要があります。

+1

これが受け入れられた答えであるかどうかは分かりません。質問はディスクへの書き込みではないからです。これは、Azureブロブストレージに書き込むことです。より具体的には、ページブロブ(コードに 'WritePagesAsync()'の呼び出しがある場合)。 Azure BLOBストレージは、複数の同時書き込み用に設計されており、ハードドライブのように最適化されていません。 OPが複数のBLOBに同時に書き込みを試みる場合、BLOB単位のトランザクションと1秒あたりのストレージアカウント単位のトランザクション(および帯域幅)によって制限されます。 –

+0

ありがとう、しかし、私は非同期にオフセットを持つ1つのBLOBに書き込みます。どのように多くのタスクを作成できますか? – Anatoly

+0

@Anatolyこれは、私の答えの「リモートリソース」の一部です。レイテンシを把握し、スロットリングが有効かどうかを確認し、最終的には異なる設定を試してベストを選びます。 – Luaan

関連する問題