0

ファイルから頻繁に読み取る必要があり、fread を使用してそのファイルを unsigned char のベクトルにロードする場合、読み取り直後に unsigned char のベクトルが破棄されたとしても、結果の fread は非常に高速です。

何か (Windows またはディスク) がファイルをキャッシュしているように見えるので、fread は非常に高速です。この動作については何も読んだことがないので、何が原因なのかはわかりません。

アプリケーションを 1 時間ほど使用せずに再度 fread を実行すると、fread が遅くなります。キャッシュが空になったようです。

誰かが私にこの振る舞いを説明できますか? 積極的に利用したいと思います。フレッドが遅いとき、それは私にとって問題です。

ファイルのメモリマッピングは理論的には機能しますが、ファイル自体が大きすぎて使用できません。

4

1 に答える 1

2

90/10 法

コンピューター プログラムの実行時間の 90% は、コードの 10% の実行に費やされます。

これは規則ではありませんが、通常はそうです。そのため、多くのプログラムは、可能であれば最新のデータを保持しようとします。そのデータがすぐに再びアクセスされる可能性が非常に高いためです。

Windows OS も例外ではありません。ファイルを読み取るコマンドを受け取った後、OS はファイルに関するデータを保持します。プログラムが保存されている年齢のメモリアドレスに保存し、可能であればバイナリデータの一部 (またはすべて) をメモリに保存し、その読み取りが最初のファイルの直後であれば、次のファイルの読み取りをはるかに高速にします。

全体として、キャッシングがあることは正しいですが、私はマイクロソフトで働いていないので、それが実際に行われているとは言えません...


また、質問の次の部分に答えます。メモリへのファイル マッピングは解決策になるかもしれませんが、ファイルが非常に大きい場合、マシンには十分なメモリがない可能性があるため、オプションではありません。ただし、90/10 の法則を使用できます。あなたの場合、ファイルの一部だけをメモリにマップする必要があります(最も重要な部分)。また、読み取り中に、全体的なパラメーターのデータ テーブルを作成する必要があります。

正確な状況はわかりませんが、保存される可能性があります。

于 2013-10-11T20:46:59.647 に答える