Java 自动选择文件I/O的缓冲区大小

Java 自动选择文件I/O的缓冲区大小,java,c++,c,file-io,buffer,Java,C++,C,File Io,Buffer,我有一个基本的疑问。通常,我必须编写使用缓冲文件I/O的应用程序,每当我面临选择缓冲区大小的两难境地时,我就会进行反复试验,结果往往非常糟糕。我想知道是否有任何方法或算法可以根据底层平台自动确定作业的最佳缓冲区大小,就像Teracopy在Windows中处理文件时所做的那样。我主要使用Qt作为GUI 如果可能的话,我们非常欣赏C/C++/C#/Java中的一个小例子 谢谢 在Java中,最佳的一级缓存大小通常在32KB左右。在Java中,至少选择1024字节或1MB并没有多大区别(我在C中看到了

我有一个基本的疑问。通常,我必须编写使用缓冲文件I/O的应用程序,每当我面临选择缓冲区大小的两难境地时,我就会进行反复试验,结果往往非常糟糕。我想知道是否有任何方法或算法可以根据底层平台自动确定作业的最佳缓冲区大小,就像Teracopy在Windows中处理文件时所做的那样。我主要使用Qt作为GUI

如果可能的话,我们非常欣赏C/C++/C#/Java中的一个小例子


谢谢

在Java中,最佳的一级缓存大小通常在32KB左右。在Java中,至少选择1024字节或1MB并没有多大区别(我在C中看到了以下代码:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  struct stat fi;
  stat("/", &fi);
  printf("%d\n", fi.st_blksize);
  return 0;
}
#包括
#包括
#包括
#包括
int main()
{
结构统计fi;
统计数据(“/”、&fi);
printf(“%d\n”,fi.st\u blksize);
返回0;
}

它返回最佳块大小。你需要使用它来实现这一点。我使用16*块大小的流源到目标以获得最佳性能。因为此测试将揭示pc在空闲状态下使用某些硬件/操作系统时的最佳性能。但不是真实情况。

纯粹的惊人!!!这在Java中几乎像上帝一样…但我不知道我能实现到什么程度他的方法是基于C/C++的,因为我的大多数应用程序都是本地的,需要尽可能快。还有一件事:你的方法是否适用于在写回数据之前对数据进行操作的应用程序(加密应用程序)??顺便说一句,Math.pow(“谢谢!!”,(10/0))与大多数应用程序一样,加密应用程序可能会被CPU绑定。在这种情况下,缓冲区大小不太重要,因为CPU成本太高。缓存的大小可能会带来更多的差异。IMO可以在爪哇做任何事情,你可以在C或C++中完成。
With 0.5 KB block size write speed 96.6 MB/s, read speed 169.7 MB/s
With 1.0 KB block size write speed 154.2 MB/s, read speed 312.2 MB/s
With 2.0 KB block size write speed 201.5 MB/s, read speed 438.7 MB/s
With 4.0 KB block size write speed 288.0 MB/s, read speed 733.9 MB/s
With 8.0 KB block size write speed 318.4 MB/s, read speed 711.8 MB/s
With 16.0 KB block size write speed 540.6 MB/s, read speed 1263.7 MB/s
With 32.0 KB block size write speed 726.0 MB/s, read speed 1370.9 MB/s
With 64.0 KB block size write speed 801.8 MB/s, read speed 1536.5 MB/s
With 128.0 KB block size write speed 857.5 MB/s, read speed 1539.6 MB/s
With 256.0 KB block size write speed 794.0 MB/s, read speed 1781.0 MB/s
With 512.0 KB block size write speed 676.2 MB/s, read speed 1221.4 MB/s
With 1024.0 KB block size write speed 886.3 MB/s, read speed 1501.5 MB/s
With 2048.0 KB block size write speed 784.7 MB/s, read speed 1544.9 MB/s
int blockSize = 32 * 1024;
ByteBuffer bb = ByteBuffer.allocateDirect(blockSize);
FileChannel out = new FileOutputStream("deleteme.dat").getChannel();
for (int i = 0; i < (1024 << 20); i += blockSize) {
    bb.clear();
    while (bb.remaining() > 0)
        if (out.write(bb) < 1) throw new AssertionError();
}
out.close();

long start = System.nanoTime();
FileChannel in = new FileInputStream("deleteme.dat").getChannel();
MappedByteBuffer map = in.map(FileChannel.MapMode.READ_ONLY, 0, in.size());
in.close();
long end = System.nanoTime();
System.out.printf("Mapped file at a rate of %.1f MB/s%n",
        1024 * 1e9 / (end - start));
Mapped file at a rate of 589885.5 MB/s
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  struct stat fi;
  stat("/", &fi);
  printf("%d\n", fi.st_blksize);
  return 0;
}