web-dev-qa-db-ja.com

パイプと一時ファイル

次の間に大きなパフォーマンスの違いがありますか?

  • プロセスAは一時ファイルに書き込み、プロセスBはそのファイルを読み取ります
  • プロセスAがパイプに書き込み、プロセスBがそのパイプから読み取ります

Windowsと* nixの両方の答えが何であるか知りたいです。

編集:私は尋ねるべきでした:バッファキャッシュは一時ファイルとパイプの違いを排除しますか?

29
Matt Fichman

大きな違いの1つは、パイプを使用すると、プロセスAとBを同時に実行できるため、Aが出力を生成し終える前にBがAからの出力を処理できることです。さらに、パイプのサイズが制限されているため、AはBが消費したよりもはるかに多くのデータを生成することはできません。 Bが追いつくのを待たせます。

データの量が多い場合、一時ファイルへの書き込みには、ファイルの作成と破棄のみを目的とした場合でも、ディスクアクティビティが含まれます。驚くほど大きなファイルの場合でも、データはメモリ内のバッファプールにとどまる可能性があります(したがって、ディスクI/Oはありません)。パイプへの書き込みは「決して」ディスクへの書き込みを伴いません。

32

大きな違いは、最初の方法は実際にはディスク上のストレージを使用するのに対し、パイプはメモリを使用することです(本当に衒学者になってスワップスペースについて考え始めない限り)。

パフォーマンス面では、メモリはディスクよりも高速です(ほとんどの場合)。これは通常、すべてのオペレーティングシステムに当てはまります。

一時ファイルを使用することが本当に理にかなっているのは、プロセスBが複数のパスでデータを検査する必要がある場合のみです(特定の種類のビデオエンコーディングなど)。この用途では、データストリーム全体をバッファリングする必要があり、十分なデータがある場合は、メモリ内の利点が失われる可能性があります。したがって、マルチパス(シークバウンド)操作の場合は、一時ファイルを使用します。

9
Chris Eberle

パイプが完全に壁から外れていることを理解していない限り、答えは「はい」です。

一時ファイルへの書き込みには、ディスクアクセスとそれに関連するオーバーヘッドが含まれます。

パイプへの書き込みとパイプからの読み取りは、メモリ内で行われます。はるかに高速。

2
Andrew Cooper

実用的な答えが役立つかもしれないと思いました。使用するスクリプトの速度を最適化しています。このスクリプトには約4つのステップがあります。配管方式と非配管方式を使用するように設定しました。これは、Windows 764ビットの下にあります。

配管を使用しないと3%遅くなりました。これは私にとって価値があります。なぜなら、各ステップの間に立ち止まってウィンドウのタイトルを更新できるようになったからです。これは、すべて1つのコマンドではできませんでした。

個人的には、ウィンドウのタイトルでその3%のヒットを取得します。

好奇心のために、2,000万を超えるファイルをgrepし、結果を変更する特殊なPerlスクリプトに渡し、SORT.EXEに組み込まれたウィンドウを使用して並べ替え、cygwinのUNIQ.EXEを使用して一意にし、再度grepします。 ANSIベースのgrep-result-coloringを取得するための同じ結果。ほとんどの時間は、並べ替えフェーズに費やされます。

0
ClioCJS