0

Python のメモリ エラーに関する質問がありましたが、私の状況にさらに具体的な質問をしたいと思います。私はプログラミングとPythonが初めてです。

大きなテキスト ファイル (~8GB) を解析する場合、行

mylist = [line.strip('\n').split('|') for line in f]

「MemoryError」が発生しました。

12 GB の RAM を搭載した Windows XP 64 ビットで 64 ビットの Python [MSC v.1500 64 ビット (AMD64)] を実行しています。RAM を増設する以外に、このメモリ エラーを処理するにはどうすればよいですか?

4

4 に答える 4

5

ファイル全体をリスト(メモリ内)に保存しようとしているため、メモリエラーが発生しています。したがって、保存するのではなく、各行で作業してみてください。

for line in f:
   data = line.strip('\n').split('|')
   #do something here with data
于 2012-11-21T08:03:19.757 に答える
3

リストで何をしたいかによって異なります。

行ごとに作業したい場合は、おそらくリスト内包表記の代わりにリストジェネレーターを使用して作業を完了することができます。これは次のようになります。

myiterator = (line.strip('\n').split('|') for line in f)

(私が変更[...]したわけではありません(...))。これはリストの代わりに反復子を返します。for line in fまた、リストも作成しないため、一度に 1 行ずつロードします。

すべての行を一度に処理したい場合は、これを別の手法と組み合わせて、すべてのメモリを使用しないようにする必要があります。

于 2012-11-21T08:06:34.833 に答える
1

このような巨大なファイルを一度に 1 行ずつ解析するか、ファイルを小さなチャンクに分割するには、必ず遅延ジェネレーターを使用する必要があります。

1 つの可能性:

def lazy_reader(path):
    """reads a file one line at a time."""
    try:
        file = open(path, 'r')
        while True:
            line = file.readline()
            if not line: break
            yield line             # "outputs" the line from the generator
    except IOError:
        sys.stderr.write("error while opening file at %s\n" % path)
        sys.exit(2)
    finally:
        file.close()

そして、このようにジェネレーターを消費できます

for line in lazy_reader("path/to/your/file"):
    do_something_with(line)

EDIT:ジェネレーターをきちんとした「パイプライン」の方法で組み合わせることもできます:

def parse(generator):
    for line in generator: yield line.strip('\n').split('|')

for data in parse( lazy_reader("path/to/your/file") ):
    do_something_with_splitted_array(data)
于 2012-11-21T08:07:22.523 に答える
1

withエラーを簡単にするために使用し、どのlinesように見えるべきかを定義するジェネレーターを使用して、それを反復します。

with open('somefile') as fin:
    lines = (line.strip('\n').split('|') for line in fin)
    for line in lines:
        pass # do something with line
于 2012-11-21T08:27:14.340 に答える