Azure存储中Blob的阅读线确实很慢

时间:2019-05-28 15:00:39

标签: c# azure-storage

我使用CloudBlockBlob和OpenReadAsync在azure存储中打开文件,并使用readline循环遍历该文件以处理行。

但是,这确实很慢,并且要花费大约3GB的时间来遍历3gb文件。其中有7000万行。

这样的最佳实践是什么?首先下载到临时目录?但我不知道这是否会使阅读速度更快?

1 个答案:

答案 0 :(得分:0)

作为参考,我对在流中并行读取块blob有一个想法。

根据有关Azure Blob storage limits的官方文档,一个块Blob中一个块的最大大小为100 MB,因此,在一个3GB的块Blob文件中至少有31个块。

enter image description here

假设文件中的每一行都是由服务自动生成的,并将其写入blob,因此我认为有很多完成的行没有在一个块中中断。

因此,与多线程或多进程并行的readlines解决方案是在主线程中使用Get Block List,在Range中使用Get Blob(对于REST API,设置Range或{每个工作主题中的请求标头中的{1}},如下所示。

enter image description here

这是上面逻辑流程的步骤。

  1. 在主线程中,要获取块blob的块列表,块列表响应主体包括echo块的ID和大小,如下所示。

    enter image description here

    因此,您可以轻松计算每个块的范围,例如,上面的第一个和第二个块的范围是x-ms-range0-4194304

  2. 要创建线程池,可以指定一个工作线程来处理一个块,然后减少整个blob处理中所有行加速所花费的时间。但是,如果程序在本地运行,则仍然取决于您的网络带宽。考虑到所有线程的结果顺序,只需将每个结果及其块ID结合起来,以遵循块列表的顺序即可。

更复杂的情况是,如果将3GB文件上传到Blob存储,则块中的第一行和最后一行可能会中断。因此,除了blob的第一个块之外,您还必须处理这种情况,才能通过判断在块的末尾是否存在4194305-8388608字符来在两个相邻块中合并换行符。

希望有帮助。