为什么将数据写入磁盘的速度与将数据保留在内存中一样快?

2022-09-02 21:33:12

我有以下10000000x2矩阵:

0        0
1        1
2        2
..       ..
10000000 10000000

现在我想将这个矩阵保存到数组中:int[][]

import com.google.common.base.Stopwatch;

static void memory(int size) throws Exception {
    System.out.println("Memory");

    Stopwatch s = Stopwatch.createStarted();

    int[][] l = new int[size][2];
    for (int i = 0; i < size; i++) {
        l[i][0] = i;
        l[i][1] = i;
    }

    System.out.println("Keeping " + size + " rows in-memory: " + s.stop());
}

public static void main(String[] args) throws Exception {
    int size = 10000000;
    memory(size);
    memory(size);
    memory(size);
    memory(size);
    memory(size);
}

输出:

Keeping 10000000 rows in-memory: 2,945 s
Keeping 10000000 rows in-memory: 408,1 ms
Keeping 10000000 rows in-memory: 761,5 ms
Keeping 10000000 rows in-memory: 543,7 ms
Keeping 10000000 rows in-memory: 408,2 ms

现在我想将此矩阵保存到磁盘:

import com.google.common.base.Stopwatch;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;

static void file(int size, int fileIndex) throws Exception {
    Stopwatch s = Stopwatch.createStarted();

    FileOutputStream outputStream = new FileOutputStream("D:\\file" + fileIndex);
    BufferedOutputStream buf = new BufferedOutputStream(outputStream);
    for (int i = 0; i < size; i++) {
        buf.write(bytes(i));
        buf.write(bytes(i));
    }

    buf.close();
    outputStream.close();

    System.out.println("Writing " + size + " rows: " + s.stop());
}

public static void main(String[] args) throws Exception {
    int size = 10000000;
    file(size, 1);
    file(size, 2);
    file(size, 3);
    file(size, 4);
    file(size, 5);
}

输出:

Writing 10000000 rows: 715,8 ms
Writing 10000000 rows: 636,6 ms
Writing 10000000 rows: 614,6 ms
Writing 10000000 rows: 598,0 ms
Writing 10000000 rows: 611,9 ms

不应该更快地保存到内存中吗?


答案 1

正如评论中所说,你没有衡量任何有用的东西。JVM 在其内存中缓存写入操作,然后将其刷新到操作系统,操作系统将其缓存在其内存中,然后最终在某个时刻将其写入磁盘。
但是你只是在测量JVM在它自己的内存中缓存它所花费的时间(这是你能测量的)。

无论如何,您不应该为这种微优化而烦恼。


答案 2

您的硬盘驱动器和操作系统采用写入缓冲,以便您的系统可以在面对多个并发任务(例如,读取和写入磁盘的程序)时继续运行。这可能导致(有时确实)在桌面类计算机上发生电源故障时丢失数据。服务器和笔记本电脑也可能遇到此问题(但通常采用称为电池的复杂技术来减少机会)。无论如何,在Linux上,你可能不得不这样做,在Windows上,当它发生时,你可能会这样做。fsckchkdsk


推荐