2011-10-10 28 views
6

大きなファイル、100,000行があります。私は各行を読んでそれを処理することができます。あるいは、行を配列に格納して処理することができます。私は余分な機能のために配列を使用することを好むだろうが、私は本当に配列にその多くの行を格納することに関連付けられているメモリ使用量、そしてそれが価値がある場合は心配です。大きなファイルを1行ずつ読み込む、またはその行を配列に格納する

+1

この操作は一度だけ行う必要がありますか、多くの同時Webユーザーがこの操作をトリガーしますか?そして多くの場合、ファイルの内容をデータベースに保存してみませんか? –

+0

'SplFileObject'を使って、テキストライン(イテレータ)への配列のようなアクセスを得ることができます。 – mario

+0

おそらく、あなたの問題に対するより良いアプローチが見つかりませんでした。ごくまれに、メモリに100 000本の線を同時に開く必要があります。これを行う他の方法を考えてみましょう。あなたは既存の計画にパフォーマンスの問題があるでしょう。 – Incognito

答えて

3

2つの機能があります。

最初はfile()で、ファイル全体を配列要素に読み込み、各行を配列要素として読み取ります。これは短いファイルには適しており、おそらく100k行ファイルで使用したいものではありません。この関数は独自のファイル管理を処理するため、ファイルを明示的に開いたり閉じたりする必要はありません。

fgets()は、一度に1行ずつファイルを読み取るために使用できます。これを使用して、処理する行がさらにある限りループし、ループ内で行処理を実行することができます。このファイルのハンドルを取得するにはfopen()を使用する必要があります。リカバリ管理のためにファイルポインタを自分自身で追跡する必要があります(つまり、何かが横になりスクリプトが失敗した場合に処理を最初からやり直す必要はありません)。

これで十分です。

1

2つの組み合わせはどうですか?配列に1000行を読み込んで処理し、配列を削除してから1000個以上を読み込みます。メモリの使用状況を監視し、一度に配列に読み込む数を調整します。

関連する問題