私はディレクトリ内のファイルを検索し、コンピュータが動作している間無限に実行するpythonスクリプトを持っています。コードは次のとおりです。Pythonプログラミングのメモリリーク?多分?ファイルの検索と破棄スクリプト
import fnmatch
import os
import shutil
import datetime
import time
import gc
# This is a python script that removes the "conflicted" copies of
# files that dropbox creates when one computer has the same copy of
# a file as another computer.
# Written by Alexander Alvonellos
# 05/10/2012
class cleanUpConflicts:
rootPath = 'D:\Dropbox'
destDir = 'D:\Conflicted'
def __init__(self):
self.removeConflicted()
return
def cerr(message):
f = open('./LOG.txt', 'a')
date = str(datetime.datetime.now())
s = ''
s += date[0:19] #strip floating point
s += ' : '
s += str(message)
s += '\n'
f.write(s)
f.close()
del f
del s
del date
return
def removeConflicted(self):
matches = []
for root, dirnames, filenames in os.walk(self.rootPath):
for filename in fnmatch.filter(filenames, '*conflicted*.*'):
matches.append(os.path.join(root, filename))
cerr(os.path.join(root, filename))
shutil.move(os.path.join(root, filename), os.path.join(destDir, filename))
del matches
return
def main():
while True:
conf = cleanUpConflicts()
gc.collect()
del conf
reload(os)
reload(fnmatch)
reload(shutil)
time.sleep(10)
return
main()
とにかく。 10秒ごとにほぼ1メガバイトを追加するメモリリークがあります。私はなぜメモリが割り当て解除されていないのか分かりません。最後まで、このスクリプトは、試してみることなく、常にメモリのギグを食べるでしょう。これはイライラしています。誰もが任意のヒントを持っていますか?私はすべてを試しました、と私は思います。
import fnmatch
import os
import shutil
import datetime
import time
import gc
import re
# This is a python script that removes the "conflicted" copies of
# files that dropbox creates when one computer has the same copy of
# a file as another computer.
# Written by Alexander Alvonellos
# 05/10/2012
rootPath = 'D:\Dropbox'
destDir = 'D:\Conflicted'
def cerr(message):
f = open('./LOG.txt', 'a')
date = str(datetime.datetime.now())
s = ''
s += date[0:19] #strip floating point
s += ' : '
s += str(message)
s += '\n'
f.write(s)
f.close()
return
def removeConflicted():
for root, dirnames, filenames in os.walk(rootPath):
for filename in fnmatch.filter(filenames, '*conflicted*.*'):
cerr(os.path.join(root, filename))
shutil.move(os.path.join(root, filename), os.path.join(destDir, filename))
return
def main():
#while True:
for i in xrange(0,2):
#time.sleep(1)
removeConflicted()
re.purge()
gc.collect()
return
main()
私はこの問題について、いくつかの研究努力を行ってきたし、持っているのfnmatchのバグ、あるかもしれないようにそれはそう:ここ
は、ここで提案された変更の一部を行った後、更新されたバージョンです使用後にパージされない正規表現エンジン。だから私はre.purge()を呼び出します。私はこれで2時間ほど手を触れてきました。
私もやっていることを発見しました。すべての反復で
print gc.collect()
0を返します。
私を落とした者は誰でも間違いと誤解されています。私は本当にここでいくつかの助けが必要です。 Why am I leaking memory with this python loop?
なぜリロードしていますか? –
私は10秒ごとにそれらのモジュールをリロードしないでください - 私はそれの理由を見ることができません。また、すべての 'del'ステートメントが必要ではないはずです(私はあなたがリークを持っている場合にそれらを試してみる理由を知ることができます)。そして、あなたは確かにすべての関数の最後に' return'を必要としません。 – Peter
このリークの原因を突き止めるためにリロードしています。他に提案はありますか?これがどこから来たのかについてのポインタが得られたら、私は自分のコードにいくつかの変更を加えます。 –