携帯電話用の簡単なPythonスクリプトを作成して、urrlib2を使用してWebページを定期的にロードしようとしています。実際、私はサーバーの応答についてはあまり気にしません。URLのいくつかの値をPHPに渡したいだけです。問題は、Python forS60が古い2.5.4Pythonコアを使用していることです。これは、urrlib2モジュールでメモリリークが発生しているようです。私が読んだように、あらゆるタイプのネットワーク通信にもそのような問題があるようです。このバグはここで報告されています数年前、いくつかの回避策も投稿されました。そのページで見つけたすべてのことをGoogleの助けを借りて試しましたが、約70ページの読み込み後も携帯電話のメモリが不足しています。不思議なことに、Garbege Collectorは、スクリプトを大幅に遅くすることを除いて、何の違いももたらさないようです。新しい(3.1)コアがこの問題を解決すると言われていますが、残念ながら、S60ポートが来るのを1年(またはそれ以上)待つことはできません。
私が見つけたすべての小さなトリックを追加した後の私のスクリプトは次のようになります。
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()
「メモリを割り当てることができません」というエラーが発生せずに永久に機能させる方法についての提案はありますか?よろしくお願いします、乾杯、b_m
更新: メモリがなくなる前に92回接続できましたが、それでも十分ではありません。
update2: 前に提案したようにソケットメソッドを試しました。これはこれまでのところ2番目に良い(間違った)解決策です:
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回のアップロード後に閉じます(電話には50MBのメモリが残っていますが、明らかにPythonシェルにはありません)。
更新:私は解決策に近づいていると思います!ソケットを閉じたり開いたりせずに複数のデータを送信してみました。この方法では開いているファイル記述子が1つだけ残るため、これが重要な場合があります。問題は:
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、ソフトウェアにより接続が中止されました
複数のメッセージを送信できないのはなぜですか?