Как вы можете уменьшить / ограничить пропускную способность при очистке больших изображений? - PullRequest
0 голосов
/ 02 января 2019

Я загружаю около 10 миллионов изображений, и после небольшого эксперимента по загрузке первых 1000 я заметил, что каждое занимает ~ 4,5 секунды (что может быть немного ускорено с multiprocessing.Pool с), но самая большая проблема заключается в том, чтосредний размер изображения ~ 2400x2400 при ~ 2,2 МБ.Я могу изменить их размер, как только они будут загружены, но основным узким местом (в настоящее время) является пропускная способность интернета.Есть ли способ загрузить изображения напрямую в более низком разрешении?

Пример фиктивного кода:

import requests

resp = requests.get("some_url.jpg")
with open(fn, 'wb') as f:
    f.write(resp.content)

1 Ответ

0 голосов
/ 02 января 2019

Снижение

Если не доступны другие файлы с более низким разрешением → нет. Если на сервере не существует какого-либо API или чего-то еще, вы хотите загрузить файл (изображение), который изменяет его на сервере перед отправкой содержимого в ответ.

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

Для принудительного использования попробуйте использовать определенные заголовки , такие как Accept-Encoding.

Ограничение

Создайте простой счетчик для данных (вы можете подсчитать байты во время обработки или после загрузки ), и если вы не хотите, например, достичь. более 100 МБ за 5 минут или около того, а затем просто введите time.sleep() для каждого загруженного фрагмента 100 МБ.

Незначительные ноты

Thread не поможет вам распараллелить работу, используйте multiprocessing.Pool или лайки, чтобы действительно разделить работу на несколько процессов, чтобы вы могли получать (случайные числа) например 100 файлов на процесс в течение 1 минуты - до 400 файлов, загруженных 4 процессами одновременно, каждый из которых загружает 100 файлов.

...