ソートされたcsvファイルである50GBのファイルがあります。
CまたはJavaを使用してメモリマップアクセスを使用してこのファイルのルックアップを実行していた場合、理論的には違いがありますか?
ファイル アクセスがオペレーティング システム レベルにプッシュ ダウンされるため、大きな違いはないと思います。
ソートされたcsvファイルである50GBのファイルがあります。
CまたはJavaを使用してメモリマップアクセスを使用してこのファイルのルックアップを実行していた場合、理論的には違いがありますか?
ファイル アクセスがオペレーティング システム レベルにプッシュ ダウンされるため、大きな違いはないと思います。
理論的には、Java のオブジェクト指向メソッド呼び出しによる追加の間接化が必要なため、またおそらく Java/JNI 境界を越える必要があるため、Java は非常に遅くなります。
実際には、Hotspot コンパイラはByteBuffer への直接アクセスを最適化し、ページ フォールトのコストは余分なメモリの間接化をはるかに上回ります。
質問に対して直接的な答えを与える。
Cmmap()
と JavaFileChannel.map()
はほぼ同等であると見なされており、パフォーマンスに大きな違いはありません。
Java は一度に 2 GB しかマップできません。これは、ByteBuffer が長さ、サイズなどに 32 ビット整数を使用するためです。したがって、50 GB ファイルには 25 mmaps が必要になります。Cは単一のmmapを作成できますが、1990年代のコンピューターには移植できません(気にする場合)