わかりました。読み取りには1GB、書き込みには1GBがあります。ハードドライブによっては、読み取り速度が約100 MB / s、書き込み速度が60 MB/sになる場合があります。これは、読み取りと書き込みに約27秒かかることを意味します。
あなたのドライブの速度はどれくらいですか、そしてこれよりどれくらい遅いですか?
処理せずにディスクの速度をテストする場合は、最近アクセスしていない(つまり、ディスクキャッシュにない)ファイルをコピーするのにかかる時間を測定します。これにより、最小遅延がわかります。ファイルからほとんどのデータを読み取ってから書き込むことを期待できます(つまり、処理やJavaを使用せずに)
ループの少ないデータのコピーを実行する方法を知りたい人のために、つまり、ループするメソッドを呼び出すだけではありません。
FloatBuffer src = // readable memory mapped file.
FloatByffer dest = // writeable memory mapped file.
src.position(start);
src.limit(end);
dest.put(src);
混合タイプのデータがある場合は、概念的に一度に1バイトをコピーするByteBufferを使用できますが、実際には、一度に8バイト以上をコピーするために長いタイプまたはより広いタイプを使用できます。つまり、CPUが実行できることは何でも。
小さなブロックの場合、これはループを使用しますが、大きなブロックの場合、OSでページマッピングのトリックを使用できます。いずれにせよ、それがどのように行われるかはJavaで定義されていませんが、データをコピーするための最速の方法である可能性があります。
これらのトリックのほとんどは、すでにメモリ内にあるファイルをキャッシュされたファイルにコピーしている場合にのみ違いがあります。ディスクからファイルを読み取るか、ファイルが大きすぎて物理ディスクのIO帯域幅をキャッシュできないとすぐに、本当に重要なのは物理ディスクのIO帯域幅だけです。
これは、CPUがメインメモリに6 GB / sでデータをコピーできるが、ハードドライブには60〜100 MB/sしかコピーできないためです。CPU /メモリ内のコピーが2倍、10倍、または50倍遅い場合でも、ディスクを待機しています。注:バッファリングがない場合、これは完全に可能であり、さらに悪いことになりますが、単純なバッファリングがあれば、CPUはディスクよりも高速になります。