繁体   English   中英

如何在azure博客中读取大的csv文件

[英]how to read a big csv file in azure blog

我将在azure中获得一个巨大的csv文件作为blob,并且需要在azure函数中逐行解析

我正在读取容器中的每个blob,然后得到的是字符串,但我认为这会加载所有内容,然后用新行将其拆分。 有没有更聪明的方式做到这一点?

container_name = "test"
block_blob_service = BlockBlobService(account_name=container_name, account_key="mykey")
a = block_blob_service.get_container_properties(container_name)
generator = block_blob_service.list_blobs(container_name)

for b in generator:
    r = block_blob_service.get_blob_to_text(container_name, b.name)
    for i in r.content.split("\n"):
        print(i)

我不确定您的文件有多大,但是对于大于200MB的超大文件,我将使用流传输方法。 调用get_blob_to_text下载整个文件,并将其全部保存在内存中。 使用get_blob_to_stream允许您get_blob_to_stream读取并逐个处理,仅将当前行和工作集存储在内存中。 这是非常快且非常有效的内存。 我们使用类似的方法将1GB的文件拆分为较小的文件。 1GB需要花费几分钟的时间来处理。

请记住,根据您的功能应用程序服务计划,默认情况下,最大执行时间为5分钟(您可以在hosts.json中将其增加到10分钟)。 同样,在使用计划中,每个功能服务(而非每个功能-功能PaaS中的所有功能)只能使用1.5 GB的内存。 因此,请注意这些限制。

从文档

get_blob_to_stream(container_name, blob_name, stream, snapshot=None, start_range=None, end_range=None, validate_content=False, progress_callback=None, max_connections=2, lease_id=None, if_modified_since=None, if_unmodified_since=None, if_match=None, if_none_match=None, timeout=None)

这是关于该主题的好读物

阅读其他网站并修改上面链接上的某些代码后,

import io
import datetime
from azure.storage.blob import BlockBlobService

acc_name = 'myaccount'
acc_key = 'my key'
container = 'storeai'
blob = "orderingai2.csv"

block_blob_service = BlockBlobService(account_name=acc_name, account_key=acc_key)
props = block_blob_service.get_blob_properties(container, blob)
blob_size = int(props.properties.content_length)
index = 0
chunk_size =  104,858 # = 0.1meg don't make this to big or you will get memory error
output = io.BytesIO()


def worker(data):
    print(data)


while index < blob_size:
    now_chunk = datetime.datetime.now()
    block_blob_service.get_blob_to_stream(container, blob, stream=output, start_range=index, end_range=index + chunk_size - 1, max_connections=50)
    if output is None:
        continue
    output.seek(index)
    data = output.read()
    length = len(data)
    index += length
    if length > 0:
        worker(data)
        if length < chunk_size:
          break
    else:
      break

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM