2012-05-24 4 views
1

Я в процессе написания модуля python для POST-файлов на сервер, я могу загружать файлы размером до 500 МБ, но когда я попытался загрузить файл 1gb, загрузка не удалась. Если бы я был использовать что-то вроде cURL, это не подведет. Я получил код после googling, как загрузить multipart formdata с помощью python, код можно найти here. Я только что собрали и побежал этот код, ошибка я получаю этоОшибка загрузки большого файла

Traceback (most recent call last): 
    File "<pyshell#7>", line 1, in <module> 
    opener.open("http://127.0.0.1/test_server/upload",params) 
    File "C:\Python27\lib\urllib2.py", line 392, in open 
    req = meth(req) 
    File "C:\Python27\MultipartPostHandler.py", line 35, in http_request 
    boundary, data = self.multipart_encode(v_vars, v_files) 
    File "C:\Python27\MultipartPostHandler.py", line 63, in multipart_encode 
    buffer += '\r\n' + fd.read() + '\r\n' 
MemoryError 

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

+0

Возможно, я что-то недопонимаю, но при загрузке 1 Гб предполагается, что предел сервера составляет 500 мегабайт. – kevin628

+0

Я не устанавливал никаких ограничений, как я уже сказал, я могу загрузить 1gb + файлы с помощью cURL. – cyberbemon

+0

@cyberbemon: трассировка показывает, что код пытается загрузить весь файл в памяти ('fd.read()'). Либо увеличьте разрешенный объем памяти для процесса или поток контента (как «завиток», вероятно, см. Http://stackoverflow.com/questions/2502596/python-http-post-a-large-file-with -streaming – jfs

ответ

5

Этот сценарий не очень умный и строит тело POST в памяти.

Таким образом, для POST 1GB-файла вам понадобится 1 ГБ памяти для хранения этих данных, а также заголовков HTTP, границ и питона и самого кода.

Вам придется переработать скрипт, чтобы вместо этого использовать mmap, где вы сначала построили весь объект в временном файле, прежде чем передавать этот файл, завернутый в значение mmap.mmap, чтобы передать его request.add_data.

См. Python: HTTP Post a large file with streaming, чтобы узнать, как этого достичь.

+0

Спасибо, я посмотрю на него и опубликую обновления. Вы случайно знаете, как запустить программу, опубликованную во второй ссылке? – cyberbemon

+0

Не знаете, какую ссылку вы имеете в виду. –

+0

Было 2 ссылки, размещенные в вопросе [здесь] (http://code.activestate.com/recipes/146306/) - это тот, о котором я говорю, – cyberbemon

Смежные вопросы