私の目標は、から 1,000 万個の一時ファイルを削除することでしたdir
。そこで、これを行うための Python スクリプトを作成しようとしました。最初のシナリオは次のようになりました。
#!/usr/bin/python
import os,sys
dirname = os.getcwd() if len(sys.argv) == 1 else sys.argv[1]
deleteConfirm = raw_input('Delete all files from dir ' + str(dirname) + ' (y/n)? ')
if(deleteConfirm not in ['y','Y']):
os._exit(0)
counter = 0
flist = os.listdir(dirname)
for file in flist:
os.remove(os.path.join(dirname, file))
counter+=1
if(0==counter%1000):
sys.stdout.write('\rDeleted %d files' % counter)
sys.stdout.flush()
print '\nDeleted %d files' % counter
このコードは機能しますが、10 ~ 15 秒ごとに停止し、1 分程度は機能しないことがわかりました。たとえば、最初の数秒のシナリオでは、削除されたファイルの数がすぐに出力されます。28,000 個のファイルが 3 ~ 5 秒間だけ削除されますが、その後、「28,000 個のファイルが削除されました」というメッセージで出力が停止し、長時間 (1 分程度) 待機します。次に、出力が再びすばやく更新され、数秒で数千のファイルが削除されます。しかし、再び停止し、何かを待っています。これはロックされたファイルが原因だと思うので、python3とマルチプロセッシングモジュールを使用して、いくつかのプロセスでファイルを削除する新しいシナリオを作成しようとしました。あるプロセスがファイルのクロックが解除されるのを待っていても、他のプロセスがその仕事をするので、それが役立つかもしれないと思いました.
新しいスクリプトは次のとおりです。
#!/usr/bin/python3
import os, sys, time
from multiprocessing import Pool
dirname = os.getcwd() if len(sys.argv) == 1 else sys.argv[1]
procNum = 5 if len(sys.argv) < 3 else sys.argv[2]
deleteConfirm = input('Delete all files from dir ' + str(dirname) + ' (y/n)? ')
if(deleteConfirm not in ['y','Y']):
sys.exit()
def main():
flist = os.listdir(dirname)
count = len(flist)
if count < 100000:
counter = 0
for file in flist:
os.remove(os.path.join(dirname, file))
counter+=1
if(0==counter%1000):
sys.stdout.write('\rDeleted %d files' % counter)
sys.stdout.flush()
print('\rDeleted %d files' % counter)
sys.exit(0)
else:
workers = Pool(processes=procNum)
result = workers.imap_unordered(delfile,flist)
workers.close()
while True:
time.sleep(5)
completed = result._index
if completed == count:
print('')
break
sys.stdout.write('\rRemoved %d files' % result._index)
workers.join()
def delfile(fname):
os.remove(os.path.join(dirname,fname))
この新しいスクリプトを試してみましたが、前のシナリオと同様に数秒ごとに停止します。なぜこれが起こっているのか分かりません。何か案は?