2011-06-29 7 views
1

基本的には、4gigのテキストファイルを1行ごとに処理する必要があります。Pythonでの大きなテキストファイルの扱い

.readline()を使用するか、またはin line in fを使用するとメモリには掛かりますが、IOには時間がかかります。利回りのようなものを使いたいと思っていますが、それは(私が思う)線を切り詰めるでしょう。

POSSIBLE ANSWER:

file.readlines([sizehint])¶ 
Read until EOF using readline() and return a list containing the lines 

のでお読みください。オプションのサイズヒント 引数が存在する場合は、 のEOFまでの読み取りではなく、 の合計サイズのヒントバイト (おそらく の内部バッファサイズに切り上げた後)が読み込まれます。 ファイル形式の を実装するオブジェクトは、実装できない場合は サイズヒントを無視するか、効率的に実装できない場合があります。

これを行うことができませんでしたか?

+0

あなたはログファイルを解析していますか?そうしないでください。それをより良くするライブラリがあります。 –

+0

ナナナナナナナナナナナイテレータ! (バットマンテーマbtw) –

+0

大きなセットアップファイルと行を追加しています。私はreadlines()を動作させようとしていますが、それは困難であることが証明されており、リクエストされた次のチャンクに移動するようには見えません。 – jdborg

答えて

7

あなただけのファイルオブジェクトを反復処理することができます。

with open("filename") as f: 
    for line in f: 
     whatever 

これは、パフォーマンスを向上させるためにいくつかの内部バッファリングを行います。 (file.readline()は、バッファリングされないため、かなり悪化します。そのため、ファイルオブジェクトに反復を組み合わせることはできません)

+0

これは私が.readline()を使用することによって意味されたもので、メモリ上でこのように動作しますが、年月を要します。 – jdborg

+0

@jdborg: 'file.readline()'は、ファイルを反復処理するのとはまったく異なります。反復処理ではバッファリングが行われ、パフォーマンスのボトルネックは発生しません。 –

0

1行単位で何かを実行したい場合は、ファイルオブジェクトをループ:

f = open("w00t.txt") 
for line in f: 
    # do stuff 

しかし、回線ごとにものを行うと、パフォーマンスの実際のボトルネックになることがあるので、おそらくあなたは、より良いチャンクサイズを使用する必要がありますか?たとえば、4096バイトを読み込み、最後の行が\nで終わっていることを確認し、その部分を処理し、次のチャンクに残されている部分の前に追加します。

+0

これは私が.readline()を使って意味したもので、メモリ上でこのようにしていますが、年月を要します。 – jdborg

+0

@jdborg:私の答えの2番目の部分を読んでください。 – orlp

0

あなたはいつもラインをチャンクすることができますか?私は、なぜ1つのファイルを開き、同じファイルを6回開いて繰り返し実行できるのかをすべて確認することを意味します。例:

a #is the first 1024 bytes 
b #is the next 1024 
#etcetc 
f #is the last 1024 bytes 

各ファイルハンドルは別のプロセスで実行されており、ガスで調理し始めます。行末を適切に処理することを忘れないでください。

関連する問題