HTTPSConnection.getresponse() ...reesponse.read() протекает память. Нет?

Привет!
У меня возникла необходимость питоном опрашивать массированно удаленный сервер.
Оказалось что примерно к 5-6й тысяче запросов кончаеются 2ГБ оперативки.
После бессонного дня нашел точку в которой питон «потек»:
image
в 32й строке после срабатывания response.read() сразу улетает четверть мегабайта. И в дальнейшем никакие del-ы и gc.collect-ы не спасают. Скажите мне — что не так? Сервер дает в ответ XML всего в 2713 байт, но каждая тысяча запрососв отъедает 250 Mb. Происходит это независимо от остальных операция, parseString не влияет. Хотя я стартую опрос внутри воркера параллельно с другими запросами пачками по 20-100 штук, может ли от этого течь? Обертка для воркера самая что ни на есть стандартная — из официальных питоновских доков. Сервер отвечает, все нормально, все стабильно, но память течет именно после response.read() и всегда именно 250 Mb на 1000 запросов. Где лежит проблема? Прошу помощи.
  • Вопрос задан
  • 2610 просмотров
Пригласить эксперта
Ответы на вопрос 4
@MikhailEdoshin
Я бы проверил pdb этот код и на response.read вошел бы в функцию. Насколько я понимаю, это вызывается HTTPConnection.read из httplib, но там несколько вариантов — хорошо бы понять хотя бы в какую ветку идет код.
Ответ написан
Вы объект Connection еще где-то используете? Если нет — делайте локальным. Тоже самое и с response. Вообще течь read() не может, там все примитивно — прямое чтение из сокета. Течет скорее всего после parseString.

Можено посмотреть как вы вызываете метод doHTTPSRequest? И что дальше происходит? В том числе и с объектом EBayItem
Ответ написан
@MikhailEdoshin
А какой у вас питон и операционка, кстати?
Ответ написан
unconnected
@unconnected
Идиотское предположение и решение, которое тем не менее, сработало в проекте на c# (питон, честно скажу, не знаю и с ним никогда не работал). Тоже текла память тоннами при обработке веб-запроса, сборщик мусора не соображал чистить память при чтении текста прямо в обрабатывающую функцию.

Спасло примерно следующее:
tempVariable=request.ReadFunction();
parseFunction(tempVariable);
tempVariable=null;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы