Подтвердить что ты не робот

Почему запись данных на диск так же быстро, как хранение в памяти?

У меня есть следующая матрица 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

Не следует сохранять в памяти гораздо быстрее?

4b9b3361

Ответ 1

Как сказано в комментариях, вы не измеряете ничего полезного. JVM кэширует операцию записи в своей памяти, которая затем сбрасывается в операционную систему, которая кэширует ее в своей памяти, прежде чем, наконец, записать ее на диск в какой-то момент.
Но вы только измеряете время, необходимое JVM для его кэширования в своей собственной памяти (это все, что вы можете измерить).

Во всяком случае, вы не должны беспокоиться о таких микро оптимизациях.

Ответ 2

На вашем жестком диске и в операционной системе используется буферизация записи, чтобы ваша система могла продолжать работу перед множеством параллельных задач (например, чтение и запись программ). Это может (и иногда это) приводит к потере данных в случае сбоя питания на компьютерах классов классов. Серверы и ноутбуки также могут столкнуться с проблемой (но обычно используют сложные технологии, называемые батареей для снижения шансов). В любом случае, в Linux вам может понадобиться fsck, а в Windows вы можете chkdsk, когда это произойдет.