OS ブロック バッファーにファイルを保持する
-
02-07-2019 - |
質問
RAM に収まるサイズより大きいファイルであっても、オペレーティング システムのブロック キャッシュにできるだけ多くの大きなファイルを保持する必要があり、別の非常に大きなファイルを継続的に読み取っています。ATM 別のファイルからストリーミング読み取りを行うときに、大きな重要なファイルの大きなチャンクをシステム キャッシュから削除します。
解決
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 などの古いバージョンでも、より基本的なトリックを実行できるでしょう。しかし、頭では機能が分からず、調べる時間がありません。
他のヒント
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
ただし、読み取りサイズとバッファの配置にいくつかの制限が課されます。
一部のオペレーティング システムには、ストレージ用に RAM のセグメントを確保し、それをファイル システムとしてマウントするために使用できる RAM ディスクが搭載されています。
しかし、私が理解できないのは、なぜオペレーティング システムがファイルをキャッシュしないようにしたいのかということです。あなたの質問全文は私にはまったく意味がわかりません。
RAM を追加購入するか (比較的安価です!)、OS に任せます。OS を回避するのは、価値があるというよりも面倒なことがわかると思います。OS は、アプリケーションまたは他のアプリケーションがメモリを必要とするまで、必要な量のファイルをキャッシュします。
プロセスの数を最小限に抑えることもできると思いますが、メモリを追加購入した方が早いでしょう。
mlock() と mlockall() はそれぞれ、呼び出しプロセスの仮想アドレス空間の一部またはすべてを RAM にロックし、そのメモリがスワップ領域にページングされるのを防ぎます。
(MLOCK(2) Linux マニュアル ページからコピー)