【问题标题】:Readlines of blob in Azure Storage Really SlowAzure 存储中 blob 的 Readlines 真的很慢
【发布时间】:2019-05-30 17:09:46
【问题描述】:

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

但是,这真的很慢,并且需要很长时间才能通过大约 3gb 的文件。 7000 万行。

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

【问题讨论】:

标签: c# azure-storage


【解决方案1】:

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

根据Azure Blob storage limits的官方文档,一个block blob中一个block的最大大小是100 MB,所以一个3GB的block blob文件中至少有31个block。

假设文件中的每一行都是由服务自动生成写入一个blob,所以我认为有很多完整的行没有中断。

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

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

  1. 在主线程中,为了获取block blob的block list,block list response body中包含了echo block的id和size,如下所示。

    所以你可以很容易地计算出每个块的范围,例如上面,第一个和第二个块的范围是0-41943044194305-8388608

  2. 要创建线程池,可以指定一个工作线程来处理一个block,从而降低整个blob处理的所有行的时间成本加速。但是,如果程序在本地运行,它仍然取决于您的网络带宽。考虑到所有线程的结果顺序,只需将每个结果与它的block id结合起来,按照block list的顺序。

更复杂的情况,如果将 3GB 的文件上传到 Blob 存储,可能会破坏块中的第一行和最后一行。所以除了blob的第一个块外,你必须处理这种情况,通过判断块末尾是否存在\n字符来连接两个相邻块中的断线。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 2013-09-06
    • 2021-07-09
    • 1970-01-01
    • 2021-04-15
    • 2017-11-10
    • 1970-01-01
    • 2017-11-10
    • 2010-12-28
    相关资源
    最近更新 更多