9

ファイル全体を一度に読み取る場合と比較して、行ごとに while を読み取る場合に (理論的には) 顕著な違いはありますか?

ファイル全体を読み取ると、メモリの使用量にマイナスの影響がありますが、動作は速くなりますか?

ファイルを読み取って各行を処理する必要があります。一度に 1 行ずつ読み取って処理する必要があるのか​​、それともファイル全体を読み取ってすべて処理してから出力に書き込むべきなのかわかりません。

行ごとに読み取るように prgm を既にセットアップしましたが、ファイル全体を読み取るように変更する価値があるかどうかを知りたいです (私のセットアップでは簡単ではありません)。

ありがとう、

4

6 に答える 6

3

ファイル全体を読むと少し速くなりますが、それほど速くはありません!

ただし、システムで使用可能なメモリによって制限されるため、ファイル全体の読み取りはスケーラブルではないことに注意してください。ファイルサイズがプログラムで使用できるRAMのサイズを超えると、スワップスペースの使用が開始され、はるかに遅くなります。ファイル サイズが使用可能な仮想メモリのサイズを超えると、プログラムがクラッシュします。

于 2011-10-10T04:06:33.033 に答える
2

他の人たちと同じように、より大きな読み取りを行うとアプリケーションのパフォーマンスがいくらか向上すると思いますが、奇跡を期待しないでください。I/O は OS レイヤーで既にバッファリングされているため、多すぎることによるオーバーヘッドを減らすことによってのみ得られます。呼び出しを読み取ります。入力ファイルの最大可能サイズがわかっている場合を除き、一度にファイル全体を読み取るのは危険です。最も合理的なアプローチは、ファイルを大きなブロックで読み取ることです。

さらに改善したい場合は、I/O と処理を重ねることを検討する必要があります。入力ファイルを 128MB のブロックで読み取るとします。メイン スレッドで最初の 128MB ブロックを読み取り、それをワーカー スレッドに渡して処理します。ワーカー スレッドが動作している間、メイン スレッドは 2 番目の 128MB ブロックを読み取ります。その時点から、ワーカー スレッドがブロック N を処理している間、メイン スレッドはディスクからブロック N+1 を読み取ります。

于 2011-10-10T06:38:15.963 に答える
2

アプリケーションのニーズに依存すると思います(ほとんどのものと同様に、私は知っています)。Node js で 1 MB のファイルを読み取ると、読み取り可能なストリームまたはライン リーダーを使用するよりも、fs.readFile() を使用すると、ファイルの読み取りだけで約 3 ~ 4 倍速くなります。ファイルが非常に大きく、その場で入力を処理している場合、ストリームは追加のパフォーマンスを提供する場合があります。Node プロセスは 64 ビット システムで最大 1.5 GB のメモリ制限があるため、アプリケーションが既に多くのメモリを消費している場合にも理想的です。CPU が処理できる速度に比べてデータのソースが遅い場合 (HDD またはテープ上のアーカイブ、TCP などのネットワーク接続)、入ってくるチャンクの処理もよりパフォーマンスが高くなる可能性があります。ファイルをメモリに読み込むのと、メモリにストリーミングするのとでは、

于 2016-05-17T18:51:49.957 に答える
1

ファイル全体をメモリに読み込むことは、一般的にはお勧めできません。ファイルが巨大になる可能性があり、多くのメモリを占有し、最悪の場合はメモリ不足になる可能性があるためです。したがって、パフォーマンスとメモリ使用量のバランスを取るには、ファイルのブロックをバッファーに読み込み、バッファーを解析します。ブロックの処理が完了したら、EOF まで次のブロックを読み取ります。

達成したいことに基づいて、適切なブロックサイズを決定する必要があります。

于 2011-10-10T04:03:57.230 に答える
0

1 つの要因は、読み取るデータの量と、プログラムの最初の実行にかかる時間です。つまり、パフォーマンスを改善するメリットがあるかどうかです。

ソフトウェアのパフォーマンスについて考える上での良い一般的なアドバイスについては、この回答の本の引用を参照してください。

(あなたが理論上の答えを求めていることは知っていますが、費やす時間が限られている場合はいつでも、パフォーマンスをいつ心配するかというこの側面も重要です。)

于 2011-10-10T05:42:46.137 に答える
0

正直なところ、学位を取得している間に効率性についてしばらく調べた結果、あなたの質問について次のように結論付けました。それは、このファイルがどのくらいの頻度で読み取られるかによって異なります。一度読んだら、すべてを実行してください。それは、他のタスクのためにプロセスを解放するだけだからです。もう一度心に留めておくべきもう 1 つのことは、ファイルが後で編集され、更新が必要になるか (更新された部分のみを読み取る場合など)、その場合は、どこから読み取るかを認識するためにマーカーを設定する必要がある場合があります (そして、もう一度)。どのくらいの頻度で更新されますか?)。ただし、1 回限りの作業である場合は、ファイル内の特定のリテラルのトークンを作成する必要がない限り、先に進んで全体を読んでください。お役に立てれば。

于 2011-10-10T04:03:53.943 に答える