非常に大きく変化するファイル(通常は約1.5M行)を繰り返し処理し、各行に対して操作を実行しようとしています。これはログファイルなので、ファイルの最後に改行が追加されます。私のプログラムでは、各行が一致しなければならないパラメータを指定し、最新の一致を返すことができます。その結果、ファイルの最後から始めて、プログラムを効率的にするために作業したいと思います(行のリストを作り、それを元に戻すのではなく)。ユーザーは「リンゴ、」I「は、2016年1月4日午後12時りんご」を返すようにライン最も近いたいマッチした1行を要求した場合大容量ファイルを効率的に反復処理する
2016-01-01 01:00 apple
2016-01-02 05:00 banana
2016-01-03 03:00 apple
2016-01-04 00:00 apple
2016-01-05 12:00 banana
:ここ
は、例状況ですファイルの末尾に移動します。わずか5行しかない場合でもこれは難しいことではありませんが、何百万人もの人がいるとパフォーマンスが低下します。私はtail -n [file size]
を使用してファイルの最後から開始しようとしましたが、この方法はうまく拡張されません。パフォーマンスを向上させるために反復を使用することはできません(結果がファイルの最後の行であれば、私は150万行まで繰り返す必要はありません)。
私が試したもう一つの方法は、「チャンク」にファイルを破壊されています
|
| Remaining lines
|
...
|
| Second group of n lines
|
|
| First group of n lines
|
私はその後、各チャンクで行だけをストリーミングするためにGNU sed
を使用します。しかし、プログラムのパフォーマンスはほとんど向上していないことがわかりました(そして、nが小さくなったときに実際に苦しんでいました)。
これを実行するより良い方法はありますか(ファイルを反復処理しながら実行時間を最小限に抑える)ですか?私はLinuxのコマンドラインから(サブプロセスを通して)他のプログラムを使ってきましたが、Pythonに組み込まれたものを使うのはいいかもしれません。私は正しい方向に私を導く情報を高く評価します。
私はPython 2.7.3,2.7.10,2.7.11-c7,3.3.6、および3.5.1へのアクセス権を持つLinuxを使用しています。
この質問は多くのように、_a lot_を求められます。あなたはまだグーグルでいますか? –
可能なdublicate:http:// stackoverflow。com/questions/3346430 /最も効率的な方法で最初から最後の行になるテキストファイル –
はい、もちろんです。この問題は、表示される行の数を制限しています(つまり、ユーザーが5つの結果を望んでいて、開いている最初の10行に見つかった場合は残りのファイルを読んでいません)。単にファイルを反復処理するだけです( '反転行(open(file).readlines())')私の最善の選択肢ですか? – robben