ディレクトリ内のファイルを検索し、コンピューターの実行中に無限に検索する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()を呼び出します。私はこれを数時間いじくり回しました。
私はまた、それをしていることを発見しました:
print gc.collect()
反復ごとに0を返します。
私に反対票を投じた人は誰でも明らかに間違っています。ここで本当に助けが必要です。私が話していたリンクは次のとおりです。なぜこのPythonループでメモリリークが発生するのですか?