イメージファイルを含む大容量のtarファイル(60GB)があります。私はmmap()
これらのランダムアクセスイメージを読み取るためにファイル全体を使用しています。
私がそれを使用する理由は次のとおりですmmap()
。
- スレッドセーフ - 複数のスレッドでifstreamが見つかりません
- 追加のバッファリングを回避できます。
- いくつかのキャッシュ(すでに存在する要求されたページ形式)を取得します。
問題は、60GBファイルのすべての画像を読み取った後にどうなりますか?もちろん、すべての画像がすぐに使用されるわけではありません。画像を読み取り、表示してから削除します。
私のmmap()
電話番号は:
mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0);
問題は、カーネルが私がマップしたファイルベースの読み取り専用ページをチェックし、メモリ不足のために使用されていないページを単に消去することです。この事件が受け入れられたかどうかはよくわかりません。マニュアルページはMAP_NORESERVE
スワップスペースのサポートを必要としないと述べていますが、メモリ不足のためにページに何が起こるのか保証できないようです。ファイルシステムキャッシュまたは他のOOMプロセスを消去する前に、カーネルが不要なページを消去することは保証されていますか?
ありがとうございます!
答え1
読み取り専用は、次のものとmmap
ほぼ同じです。プロセスにマップされたメモリブロックがファイルによってサポートされている場合、RAMのコピーはディスクキャッシュの一部と見なされ、ディスクキャッシュエントリがファイルから作成されたかのようにメモリ不足のために解放されます。open
lseek
read
read
私はソースコードをチェックしていませんが、MAP_NORESERVE
読み取り専用マッピングに違いはないと思います。