我有以下算法将数据写入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
=&gt;然后list_of_tasks
有157
个任务(628 / MaxChunkSize)。通常我有超过1 TB的文件。我不想拥有如此多的运行任务,如何创建更高效的算法?什么是最佳运行任务数?例如,不超过200,任何建议?
答案 0 :(得分:1)
要按顺序将文件写入同一磁盘吗?
1
并行性仅在您可以实际并行运行任务时才有用。您的共享瓶颈是磁盘访问,如果您同时发出多个写入,这将不会更好 - 相反,它可能会变得更慢,并且它会倾向于争取优先级与其他运行的东西在同一个系统上。
硬盘驱动器针对顺序写入进行了优化。如果您遇到吞吐量问题,只需要更大一些 - 但并行写入很可能会伤害您而不是帮助。
如果您正在处理远程资源,则需要考虑延迟。如果延迟远远高于发送一个块所需的时间,那么并行化可能是值得的,以减少浪费&#34;时间 - 然而,你还需要确保一切都正确同步,并且没有任何节流会伤害你。