同様の問題にこのような関数を使用します。iterable をラップすることができます。
これを変える
for one_line in f.readlines():
コードを次のように変更するだけです。
# don't use readlines, it creates a big list of all data in memory rather than
# iterating one line at a time.
for one_line in in progress_meter(f, 10000):
ステータス メッセージの印刷にどれだけの時間を浪費したいかによって、小さい値または大きい値を選択することをお勧めします。
def progress_meter(iterable, chunksize):
""" Prints progress through iterable at chunksize intervals."""
scan_start = time.time()
since_last = time.time()
for idx, val in enumerate(iterable):
if idx % chunksize == 0 and idx > 0:
print idx
print 'avg rate', idx / (time.time() - scan_start)
print 'inst rate', chunksize / (time.time() - since_last)
since_last = time.time()
print
yield val