2011-05-20 27 views
0

この場合、何が良いのだろうと思っていましたか?Perl:複数のファイルを読むとパフォーマンスが低下する

何千ものファイルを読み込む必要があります。私は各ファイルを開いて1つを読んで閉じてしまうことを考えていました。または、すべてのファイルを1つのファイルに入れて読んでください。

提案?これはPerlですべてです。

+1

[プロファイリング](http://p3rl.org/Devel::NYTProf)は、プログラムがその行を処理する時間をほとんど費やしていることを明らかにするので、オープニング部分を最適化する価値はありません。 – daxim

+0

最初の近似では、より多くのオペコードが実行されるほど、実行に時間がかかります。これは現実にはおおよその近似に過ぎませんが、それは誤っているよりも真実です。内側のインタプリタディスパッチループが支配的になります。 – tchrist

+0

daxim:どうやってそれを知ることができますか?ゴードンはファイルで何が行われたのか説明しませんでした。彼は 'a \ nb \ nc \ n'のような1000sのファイルを持っていて、単に行を数えたいと思っています(合成例)。処理は、ファイルを実行しているディスクヘッドよりもはるかに高速であるため、多くの異なるファイルを読み取ると大きなオーバーヘッドが発生します。 @ Gordon:それが何か変わるかどうかをもっとよく伝えるために、私たちがもっと詳しく説明してください。 –

答えて

6

それほど大きな違いはありません。これは早すぎる最適化のようなものです。

0

ファイルを順番に読みます。 Perlのファイル入出力機能は、OSのネイティブファイル入出力呼び出しを中心としたかなり薄いラッパーであるため、単純なファイル入出力のパフォーマンスについてはあまり意味がありません。

2

catすべてのファイルを1つの大きなファイルにまとめる時間が問題にならない場合は、より高速になります(デフォルトでファイルを順番に読み取る場合のみ)。

もちろん、プロセスを考慮すると、読んだり、書き込んだり読んだりする必要があるため、処理が非常に遅くなります。

一般に、1000Mの1つのファイルを読むことは、100個のファイルに対して100個のファイルを読むよりも速くなければなりません。なぜなら100個のファイルのためにメタデータを探す必要があるからです。

tchristによれば、パフォーマンスの違いは重要でない可能性があります。私はそれがファイルの種類(例えば、非常に小さいファイルの数が非常に多く、それがはるかに異なっている)と、システムとストレージの全体的なパフォーマンスに依存していると思います。

+0

正しい音。もしあなたが各ファイルを複数回読むのであれば、1つの 'cat *> bigfile'の恩恵を受けるかもしれません。しかし、それが一度であれば、大きな違いはありません。 – Konerak

+0

バッファーキャッシュシステムがどれほど賢明であっても、それらを一緒に呼び出すにはコンテクストスイッチ時間が必要です。 – tchrist

1

ファイルの数がulimit -nの値より大きい場合、cat *は失敗する可能性があることに注意してください。したがって、シーケンシャルな読み取りは実際より安全です。 また、すべてのファイルが同じディレクトリにある場合はglobの代わりにopendirreaddirを使用することを検討してください。

+3

ところで、Perlの内部の 'glob'関数にはNCARGSの制限がありません。 – tchrist

+0

ええ、そうです、どうして私はそれが問題だと思ったのか分かりません。 – berekuk

関連する問題