Как устранить утечку памяти Python при использовании urrlib2?

Я пытаюсь написать простой скрипт Python для моего мобильного телефона, чтобы периодически загружать веб-страницу с помощью urrlib2 . На самом деле меня не волнует ответ сервера, я бы хотел передать только некоторые значения в URL-адресе в PHP. Проблема в том, что Python для S60 использует старое ядро ​​Python 2.5.4, который, похоже, имеет утечку памяти в модуле urrlib2. Насколько я читал, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро ​​(3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.

вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Похоже, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро ​​(3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.

вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Похоже, такие проблемы возникают и в каждом типе сетевых коммуникаций. Об этой ошибке сообщалось здесь пару лет назад, а также были опубликованы некоторые обходные пути. Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все равно не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро ​​(3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.

вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все еще не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро ​​(3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.

вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли: Я перепробовал все, что смог найти на этой странице, и с помощью Google, но моему телефону все еще не хватает памяти после загрузки ~ 70 страниц. Как ни странно, Garbege Collector, похоже, тоже не имеет никакого значения, за исключением того, что мой сценарий намного медленнее. Говорят, что более новое ядро ​​(3.1) решает эту проблему, но, к сожалению, я не могу ждать год (или больше), пока выйдет порт S60.

вот как выглядит мой сценарий после добавления каждой маленькой уловки, которую я Нашли:


import urrlib2, httplib, gc
while(true):
 url = "http://something.com/foo.php?parameter=" + value 
 f = urllib2.urlopen(url)
 f.read(1)
 f.fp._sock.recv=None # hacky avoidance
 f.close()
 del f
 gc.collect()

Есть предложения, как заставить его работать вечно без появления ошибки «не удается выделить память»? Спасибо за аванс, ура, б_м

обновление: Мне удалось подключиться 92 раза, прежде чем закончилась память, но этого все еще недостаточно.

update2: Пробовал метод сокета, как было предложено ранее, это второе лучшее (неправильное) решение на данный момент:


class UpdateSocketThread(threading.Thread):
  def run(self):
  global data
  while 1:
  url = "/foo.php?parameter=%d"%data
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.connect(('something.com', 80))
  s.send('GET '+url+' HTTP/1.0\r\n\r\n')
  s.close()
  sleep(1)

Я попробовал маленькие уловки, сверху тоже. Поток закрывается после ~ 50 загрузок (в телефоне осталось 50 МБ памяти, очевидно, в оболочке Python нет).

ОБНОВЛЕНИЕ : Думаю, я приближаюсь к решению! Я попытался отправить несколько данных, не закрывая и не открывая снова сокет. Это может быть ключевым моментом, поскольку этот метод оставляет только один открытый файловый дескриптор. Проблема:


import socket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket.connect(("something.com", 80))
socket.send("test") #returns 4 (sent bytes, which is cool)
socket.send("test") #4
socket.send("test") #4
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns the number of sent bytes, ok
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns 0 on the phone, error on Windows7*
socket.send("GET /foo.php?parameter=bar HTTP/1.0\r\n\r\n") #returns 0 on the phone, error on Windows7*
socket.send("test") #returns 0, strange...

*: сообщение об ошибке: 10053, программа вызвала прерывание соединения

Почему я не могу отправить несколько сообщений ??

8
задан b_m 26 November 2010 в 22:31
поделиться