オペレーティング システムのブロック キャッシュにできるだけ多くの大きなファイルを保持する必要がありますが、それは RAM に収まりきらないほど大きく、別の非常に大きなファイルを継続的に読み込んでいます。ATM 別のファイルから読み取りをストリーミングするときに、システム キャッシュから大きな重要なファイルの大きなチャンクを削除します。
6 に答える
Linux 内では、必要に応じて使用可能なスワップ メモリをバッキングとして使用するタイプtmpfsとしてファイル システムをマウントできます。メモリ サイズよりも大きなファイル システムを作成できるはずであり、システム キャッシュ内のそのファイル システムのコンテンツが優先されます。
mount -t tmpfs none /mnt/point
参照: http://lxr.linux.no/linux/Documentation/filesystems/tmpfs.txt
また、ファイルswapiness
とdrop_cache
/proc/sys/vm
Windows を使用している場合は、スキャンしているファイルを次のフラグで開くことを検討してください。
FILE_FLAG_SEQUENTIAL_SCAN
使用することもできます
FILE_FLAG_NO_BUFFERING
ただし、読み取りサイズとバッファーの配置にいくつかの制限が課されます。
Linux や Solaris などの POSIX システムでは、posix_fadvise を使用してみてください。
ストリーミング ファイルで、次のようにします。
posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL);
while( bytes > 0 ) {
bytes = pread(fd, buffer, 64 * 1024, current_pos);
current_pos += 64 * 1024;
posix_fadvise(fd, 0, current_pos, POSIX_FADV_DONTNEED);
}
また、他のファイルに POSIX_FADV_WILLNEED を適用すると、メモリの優先度を上げることができます。
これで、Windows Vista と Server 2008 もメモリの優先順位をうまく利用できることがわかりました。おそらく、XP のような古いバージョンでも、より基本的なトリックを行うことができます。しかし、私は頭のてっぺんから機能を知らず、それらを調べる時間がありません。
一部のオペレーティング システムには、RAM のセグメントをストレージ用に確保し、それをファイル システムとしてマウントするために使用できる RAM ディスクがあります。
しかし、私が理解できないのは、オペレーティング システムがファイルをキャッシュしないようにしたい理由です。あなたの完全な質問は、私には本当に意味がありません。
mlock() と mlockall() はそれぞれ、呼び出しプロセスの仮想アドレス空間の一部またはすべてを RAM にロックし、そのメモリがスワップ領域にページングされるのを防ぎます。
(MLOCK(2) Linux man ページからコピー)
より多くの RAM を購入するか (比較的安価です!)、OS に任せましょう。OS を回避することは、その価値よりも面倒なことになることがわかると思います。OS は、あなたのアプリケーションや他のアプリケーションがメモリを必要とするまで、必要なだけファイルをキャッシュします。
プロセスの数を最小限に抑えることもできると思いますが、メモリを購入した方が早いでしょう。