Ошибка памяти: при чтении большого файла .txt из BLOB в python - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь прочитать большой (~ 1,5 ГБ) .txt файл из BLOB-объекта Azure в python, который выдает ошибку памяти.Есть ли способ, которым я могу эффективно прочитать этот файл?

Ниже приведен код, который я пытаюсь запустить:

from azure.storage.blob import BlockBlobService
import pandas as pd
from io import StringIO
import time

STORAGEACCOUNTNAME= '*********'
STORAGEACCOUNTKEY= "********"

CONTAINERNAME= '******'
BLOBNAME= 'path/to/blob'

blob_service = BlockBlobService(account_name=STORAGEACCOUNTNAME, account_key=STORAGEACCOUNTKEY)

start = time.time()
blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME).content

df = pd.read_csv(StringIO(blobstring))
end = time.time()

print("Time taken = ",end-start)

Ниже приведены последние несколько строк ошибки.:

---> 16 blobstring = blob_service.get_blob_to_text(CONTAINERNAME,BLOBNAME)
     17 
     18 #df = pd.read_csv(StringIO(blobstring))

~/anaconda3_420/lib/python3.5/site-packages/azure/storage/blob/baseblobservice.py in get_blob_to_text(self, container_name, blob_name, encoding, snapshot, start_range, end_range, validate_content, progress_callback, max_connections, lease_id, if_modified_since, if_unmodified_since, if_match, if_none_match, timeout)
   2378                                       if_none_match,
   2379                                       timeout)
-> 2380         blob.content = blob.content.decode(encoding)
   2381         return blob
   2382 

MemoryError:

Как я могу прочитать файл размером ~ 1,5 ГБ в Python из контейнера Blob?Кроме того, я хочу иметь оптимальное время выполнения для моего кода.

1 Ответ

1 голос
/ 25 июня 2019

Предполагается, что на вашем компьютере достаточно памяти, и в соответствии с приведенной ниже ссылкой на API pandas.read_csv вы можете напрямую считывать содержимое блоба csv в кадр данных pandas с помощью URL-адреса блоба csv с токеном sas.

enter image description here

Вот мой пример кода для вас.

from azure.storage.blob.baseblobservice import BaseBlobService
from azure.storage.blob import BlobPermissions
from datetime import datetime, timedelta

import pandas as pd

account_name = '<your storage account name>'
account_key = '<your storage account key>'
container_name = '<your container name>'
blob_name = '<your csv blob name>'

url = f"https://{account_name}.blob.core.windows.net/{container_name}/{blob_name}"

service = BaseBlobService(account_name=account_name, account_key=account_key)
# Generate the sas token for your csv blob
token = service.generate_blob_shared_access_signature(container_name, blob_name, permission=BlobPermissions.READ, expiry=datetime.utcnow() + timedelta(hours=1),)

# Directly read the csv blob content into dataframe by the url with sas token
df = pd.read_csv(f"{url}?{token}")
print(df)

Я думаю, что при чтении текстового содержимого будет избегаться копирование памяти несколько раз и преобразование его в file-like объект buffer.

Надеюсь, это поможет.

...