4TB HDD ext4 ファイルシステム上のファイルに格納された 1e12 32 ビット整数 (4 TB) の配列であるデータセットがあるとします。
データがランダムである可能性が最も高い (または少なくともランダムに見える) ことを考慮してください。
// pseudo-code
for (long long i = 0; i < (1LL << 40); i++)
SetFileIntAt(i) = GetRandInt();
さらに、個々の int 要素を予測できない順序で読み取り、アルゴリズムが無期限に実行されることを考慮してください (進行中です)。
// pseudo-code
while (true)
UseInt(GetFileInt(GetRand(1<<40)));
Linux x86_64、gcc を使用しています。システムには 4 GB の RAM があると想定できます (つまり、データセットの 1000 分の 1 未満)。
アクセスを設計するには、次の 2 つの方法があります。
(A) ファイルを 4TB のメモリ ブロックに mmap し、int 配列としてアクセスします。
(B) ファイルを open(2) し、seek(2) と read(2) を使用して int を読み取ります。
A と B のうち、どちらが優れたパフォーマンスを発揮するでしょうか? また、その理由は?
AまたはBよりも優れたパフォーマンスを発揮する別の設計はありますか?