3

【初心者の質問】

やあ、

私は30GBをはるかに超える巨大なテキストファイルに取り組んでいます。

各行でいくつかの処理を行ってから、JSON形式でデータベースに書き込む必要があります。「for」を使用してファイルとループを読み取ると、データの処理の約10%後にコンピューターがクラッシュし、ブルースクリーンが表示されます。

私は現在これを使用しています:

f = open(file_path,'r')
for one_line in f.readlines():
    do_some_processing(one_line)
f.close()

また、これまでに処理されたデータ量の全体的な進捗状況をどのように表示できますか?

どうもありがとうございました。

4

3 に答える 3

4

ファイル ハンドルは反復可能であり、おそらくコンテキスト マネージャーを使用する必要があります。これを試して:

with open(file_path, 'r') as fh:
  for line in fh:
    process(line)

それで十分かもしれません。

于 2011-05-26T22:22:36.233 に答える
1

同様の問題にこのような関数を使用します。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
于 2011-05-26T22:22:09.793 に答える
0

readlineを使用すると、ファイル内の各行の終わりを見つけることができます。一部の行が非常に長い場合、インタプリタがクラッシュする可能性があります(行全体をバッファリングするのに十分なメモリがありません)。

進行状況を表示するために、たとえば次を使用してファイルサイズを確認できます。

import os
f = open(file_path, 'r')
fsize = os.fstat(f).st_size

タスクの進行状況は、処理されたバイト数をファイルサイズで割った値に100を掛けて、パーセンテージで表すことができます。

于 2011-05-26T22:25:00.127 に答える