Ошибка памяти при загрузке больших файлов Gzip и их распаковке - PullRequest
1 голос
/ 25 марта 2020

Я пытаюсь загрузить набор данных из https://datasets.imdbws.com/title.principals.tsv.gz, распаковать содержимое самого кода (Python) и записать полученные файлы на диск.

Для этого я использую следующий фрагмент кода.

results = requests.get(config[sourceFiles]['url'])
    with open(config[sourceFiles]['downloadLocation']+config[sourceFiles]['downloadFileName'], 'wb') as f_out:
        print(config[sourceFiles]['downloadFileName'] + " starting download")
        f_out.write(gzip.decompress(results.content))
        print(config[sourceFiles]['downloadFileName']+" downloaded successfully")

Этот код отлично работает для большинства zip-файлов, однако для больших файлов выдает следующее сообщение об ошибке.

File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 532, in decompress
    return f.read()
  File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 276, in read
    return self._buffer.read(size)
  File "C:\Users\****\AppData\Local\Programs\Python\Python37-32\lib\gzip.py", line 471, in read
    uncompress = self._decompressor.decompress(buf, size)
MemoryError

Есть ли способ выполнить sh, не загружая zip-файл непосредственно на диск и не распаковывая его для фактических данных.

1 Ответ

1 голос
/ 25 марта 2020

Вы можете использовать запрос streaming в сочетании с zlib:

import zlib
import requests

url = 'https://datasets.imdbws.com/title.principals.tsv.gz'
result = requests.get(url, stream=True)
f_out = open("result.txt", "wb")
chunk_size = 1024 * 1024

d = zlib.decompressobj(zlib.MAX_WBITS|32)

for chunk in result.iter_content(chunk_size):
    buffer = d.decompress(chunk)
    f_out.write(buffer)

buffer = d.flush()
f_out.write(buffer)

f_out.close()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...