好的,您有 1 GB 的读取空间和 1 GB 的写入空间。根据您的硬盘驱动器,您可能会获得大约 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);
如果您有混合类型的数据,您可以使用 ByteBuffer,它名义上一次复制一个字节,但实际上可以使用 long 或更宽的类型一次复制 8 个或更多字节。即无论CPU 能做什么。
对于小块,这将使用循环,但对于大块,它可以使用操作系统中的页面映射技巧。无论如何,它是如何做的并没有在 Java 中定义,但它可能是复制数据的最快方式。
如果您将已经在内存中的文件复制到缓存文件中,大多数这些技巧只会产生影响。一旦您从磁盘读取文件或文件太大而无法缓存物理磁盘的 IO 带宽,这是唯一真正重要的事情。
这是因为 CPU 可以以 6 GB/s 的速度将数据复制到主内存,但只能以 60-100 MB/s 的速度复制到硬盘。如果 CPU/内存中的副本比它可能的速度慢 2 倍、10 倍或 50 倍,它仍然会等待磁盘。注意:如果没有缓冲,这是完全可能的,而且更糟,但如果你有任何简单的缓冲,CPU 将比磁盘快。