многопоточные асинхронные вызовы s3 увеличивают память python - PullRequest
2 голосов
/ 22 апреля 2020

У меня есть тысячи файлов, которые нужно загрузить на s3, и они выполняются в течение l oop с многопоточным исполнителем threadpool с фьючерсами, который передает задачу исполнителя, чтобы поместить ее в s3, и ожидает ее окончания sh в конце.

в то время как есть другой поток, который выполняет некоторую другую обработку данных, прежде чем он выйдет из этого процесса.

В течение этого времени потребление памяти увеличивается, поскольку файлы в циклах вызывают нагрузку на память. Я читаю файлы в память как байты, чтобы создать ха sh для дедупликации.

Есть ли способ уменьшить потребление памяти, как.

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Я читаю файлы в память как байты, чтобы создать ха sh ...

Использовать буфер и читать чанками:

import hashlib

sha1 = hashlib.sha1()

with open(filename,'rb') as f: 
    while chunk := f.read(128*sha1.block_size): 
        sha1.update(chunk)

    print(sha1.digest())
0 голосов
/ 22 апреля 2020

Если высокое потребление памяти вызвано чтением файлов и вычислением га sh, попробуйте сделать это более итеративным способом. Это может замедлить весь процесс, но потребление памяти будет намного ниже:

def chunk_file(f, size):
    while data := f.read(size):
        yield data

hasher = hashlib.sha256()
with open("dupa.py", "rb") as f:
    for chunk in chunk_file(f, 1024):
        hasher.update(chunk)
print(hasher.hexdigest())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...