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

时间:2018-08-15 20:13:30

标签: python azure containers blob

我将在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)

2 个答案:

答案 0 :(得分:0)

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

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

From the docs

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)

Here is a good read on the topic

答案 1 :(得分:0)

在阅读了其他网站并修改了上面链接上的一些代码之后,

导入io     导入日期时间     从azure.storage.blob导入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)
    # print(length)
    index += length
    if length > 0:
        worker(data)
        if length < chunk_size:
          break
    else:
      break