Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我用java将数据写入文件的速度如此之慢_Java_File_Io_Nio - Fatal编程技术网

为什么我用java将数据写入文件的速度如此之慢

为什么我用java将数据写入文件的速度如此之慢,java,file,io,nio,Java,File,Io,Nio,我正在使用java.nio.channels.FileChannel将数据写入文件。这是我的代码: RandomAccessFile raf = new RandomAccessFile(file, "rws"); FileChannel fileChannel = raf.getChannel(); ByteBuffer buffer = ByteBuffer.allocate(4096); long offset = 0; while (offset < 1024 * 1024 * 1

我正在使用
java.nio.channels.FileChannel
将数据写入文件。这是我的代码:

RandomAccessFile raf = new RandomAccessFile(file, "rws");
FileChannel fileChannel = raf.getChannel();
ByteBuffer buffer = ByteBuffer.allocate(4096);
long offset = 0;
while (offset < 1024 * 1024 * 1024) {
    buffer.clear();
    fileChannel.write(buffer, offset);
    buffer.clear();
    offset += buffer.remaining();
    logger.warn("fake write {} {}", offset, buffer.remaining());
}
你可以看到我是按顺序写的,但是每4K花费8ms,即500kb/s。速度很慢,我真的很困惑

  • 我会使用
    write(buffer)
    并忘记
    offset
    参数,因为它可能导致查找,这将使系统调用的数量加倍。上一次我测量它(相当长一段时间以前)时,寻找效率出奇地低,即使是寻找你已经在的地方,就像在这个例子中一样

  • 如果您甚至将缓冲区的大小增加了一倍,那么总时间可能会减少近一半。4096大约是我用于任何事情的最小缓冲区大小<例如,code>BufferedOutputStream使用8192,对于备份程序,我会使用更大的东西

  • 但是如果您真的只是想写一兆字节的零,只需使用
    setLength()
    扩展
    RandomAccessFile
    。没有必要写


  • 这只是一个测试演示,我真正的程序类似于一个文件系统,它将处理大量的序列或无序列IO。我尝试过写(缓冲区),结果都是一样的。但如果我将缓冲区大小设为1M,则速度要快得多。如果这是一个真正的(旋转)磁盘,使用模式
    s
    时,您会强制几乎所有写入操作都等待磁盘旋转,而消费磁盘的速度很少超过7200rpm=8.333ms/旋转。就是这样!非常感谢你。
    WARN [11:01:58,498][writer]BackUp(151):fake write 3047424 4096
    WARN [11:01:58,507][writer]BackUp(151):fake write 3051520 4096
    WARN [11:01:58,515][writer]BackUp(151):fake write 3055616 4096
    WARN [11:01:58,523][writer]BackUp(151):fake write 3059712 4096
    WARN [11:01:58,532][writer]BackUp(151):fake write 3063808 4096
    WARN [11:01:58,540][writer]BackUp(151):fake write 3067904 4096
    WARN [11:01:58,549][writer]BackUp(151):fake write 3072000 4096
    WARN [11:01:58,557][writer]BackUp(151):fake write 3076096 4096
    WARN [11:01:58,565][writer]BackUp(151):fake write 3080192 4096
    WARN [11:01:58,574][writer]BackUp(151):fake write 3084288 4096
    WARN [11:01:58,582][writer]BackUp(151):fake write 3088384 4096
    WARN [11:01:58,590][writer]BackUp(151):fake write 3092480 4096
    WARN [11:01:58,599][writer]BackUp(151):fake write 3096576 4096
    WARN [11:01:58,607][writer]BackUp(151):fake write 3100672 4096
    WARN [11:01:58,615][writer]BackUp(151):fake write 3104768 4096
    WARN [11:01:58,624][writer]BackUp(151):fake write 3108864 4096
    WARN [11:01:58,632][writer]BackUp(151):fake write 3112960 4096