我使用CloudBlockBlob和OpenReadAsync在azure存储中打开文件,并使用readline循环遍历该文件以处理行。
但是,这确实很慢,并且要花费大约3GB的时间来遍历3gb文件。其中有7000万行。
这样的最佳实践是什么?首先下载到临时目录?但我不知道这是否会使阅读速度更快?
答案 0 :(得分:0)
作为参考,我对在流中并行读取块blob有一个想法。
根据有关Azure Blob storage limits
的官方文档,一个块Blob中一个块的最大大小为100 MB,因此,在一个3GB的块Blob文件中至少有31个块。
假设文件中的每一行都是由服务自动生成的,并将其写入blob,因此我认为有很多完成的行没有在一个块中中断。
因此,与多线程或多进程并行的readlines解决方案是在主线程中使用Get Block List
,在Range中使用Get Blob
(对于REST API,设置Range
或{每个工作主题中的请求标头中的{1}},如下所示。
这是上面逻辑流程的步骤。
在主线程中,要获取块blob的块列表,块列表响应主体包括echo块的ID和大小,如下所示。
因此,您可以轻松计算每个块的范围,例如,上面的第一个和第二个块的范围是x-ms-range
和0-4194304
。
要创建线程池,可以指定一个工作线程来处理一个块,然后减少整个blob处理中所有行加速所花费的时间。但是,如果程序在本地运行,则仍然取决于您的网络带宽。考虑到所有线程的结果顺序,只需将每个结果及其块ID结合起来,以遵循块列表的顺序即可。
更复杂的情况是,如果将3GB文件上传到Blob存储,则块中的第一行和最后一行可能会中断。因此,除了blob的第一个块之外,您还必须处理这种情况,才能通过判断在块的末尾是否存在4194305-8388608
字符来在两个相邻块中合并换行符。
希望有帮助。