Загрузка большого файла (около 3 ГБ) с помощью urllib/sock.sendall(data) OSError

окружение: Mac OS X El Capitan/python 3.5.1

Я хочу загрузить файл размером около 3 ГБ.

def read_in_chunks(file_object, chunk_size=4096):
    while True:
        data = file_object.read(chunk_size)
        if not data:
            break
        yield data

with open('3GB.mov', 'br') as f:
    data = b''.join([chunk for chunk in read_in_chunks(f)])

req = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(req)
the_page = response.read()

Проблема в ..

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 578, in urlopen
    chunked=chunked)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 362, in _make_request
    conn.request(method, url, **httplib_request_kw)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1083, in request
    self._send_request(method, url, body, headers)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1128, in _send_request
    self.endheaders(body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 1079, in endheaders
    self._send_output(message_body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 913, in _send_output
    self.send(message_body)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/http/client.py", line 885, in send
    self.sock.sendall(data)
OSError: [Errno 22] Invalid argument

Не могли бы вы дать мне несколько советов?


person Astin    schedule 05.05.2016    source источник
comment
comment
Несвязанный: вы не должны загружать весь файл в память. Но если вы это сделаете, используйте data = f.read() вместо data = b"".join(...)   -  person jfs    schedule 05.05.2016
comment
Несвязанный: stackoverflow.com/questions/11662960/ Я не могу использовать f.read() для большого файла (около ‹ 3 ГБ) в python3. Я не знаю причину. Спасибо за ваши связанные и несвязанные советы !!   -  person Astin    schedule 05.05.2016
comment
Я сказал, что в этом случае вам не следует загружать весь файл сразу :) Причина, вероятно, будет той же (OSError: [Errno 22] Invalid argument в OSX, запрашивающей ввод-вывод с большим блоком данных). Это легко обойти, как рекомендует первая ссылка: response = urlopen(Request(url, f, {'Content-Length': os.path.getsize(filename)}))   -  person jfs    schedule 05.05.2016
comment
Хорошо, я понял. Большое спасибо. Я попробую !!   -  person Astin    schedule 05.05.2016
comment
@ Себастьян, я сделал это! Еще раз спасибо. Хорошего дня :)   -  person Astin    schedule 05.05.2016


Ответы (1)


person    schedule
comment
Вы можете проверить req.get_method(), может быть, вы правы - person VelikiiNehochuha; 05.05.2016
comment
Это хорошая идея. но я не мог использовать запрос диапазона на своем сервере API. Спасибо за совет, Джаном. - person Astin; 05.05.2016