簡體   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