2016-12-03 7 views
0

私は約30万語の単語リストを実行し、そのファイルから正確に999KBのファイルを作成する小さなスクリプトを用意しています。これは完全に動作しますが、すべてが繰り返し実行されるため、すべてのファイルを開くために非常に遅いですが、このスクリプトをまったく同じ動作にすることはできますが、処理時間を短縮するにはどうすればよいでしょうか?大きなファイルから小さなファイルを作成するときの処理時間を短縮する

import os 
import hashlib 


data = [] 
count = 1 


with open("dicts/included_dicts/dictionaries/000webhost.txt") as a: 
    for line in a.readlines(): 
     h = hashlib.md5() 
     h.update(line.strip()) 
     data.append(h.hexdigest() + ": " + line.strip() + "\n") 

for item in data: 
    with open("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count), "a+") as b: 
     if os.stat("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count)).st_size <= 1022162L: 
      b.write(item) 
     else: 
      count += 1 

答えて

1

ループの外で変数を格納してみてください。

b = open("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count), "a+") 
for item in data: 
    if os.stat("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count)).st_size <= 1022162L: 
     b.write(item) 
    else: 
     count += 1 
     b.close() 
     b = open("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count), "a+") 
+0

これはうまくいく可能性があります。 – papasmurf

+0

これは動作しますが、同じ動作はし​​ません。ファイルサイズは999KBではなく1003KBです。 – papasmurf

+0

@papasmurfサイズ比較値を小さくしてみてください。 –

1

だけで文字列を作成し、それを書きます。

もう1つの方法は、プラットフォームに依存する可能性があります。他のシステムの空のファイルサイズとLinuxについてはわかりません。

cache = "" 
count = 1 
for item in data: 
    cache += item+"\n" 
    if sys.getsizeof(cache+item+"\n") > 999999-4: 
     with open("dicts/included_dicts/rainbowtables/md5_{}.rtc".format(count), "w") as b: 
      b.write(cache) 
     count += 1 
     cache = item 
関連する問題