В этой программе я заполняю 1 ГБ как значения int и «заставляю» их записывать на диск.
String dir = args[0];
for (int i = 0; i < 24; i++) {
long start = System.nanoTime();
File tmp = new File(dir, "deleteme." + i);
tmp.deleteOnExit();
RandomAccessFile raf = new RandomAccessFile(tmp, "rw");
final MappedByteBuffer map = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1 << 30);
IntBuffer array = map.order(ByteOrder.nativeOrder()).asIntBuffer();
for (int n = 0; n < array.capacity(); n++)
array.put(n, n);
map.force();
((DirectBuffer) map).cleaner().clean();
raf.close();
long time = System.nanoTime() - start;
System.out.printf("Took %.1f seconds to write 1 GB%n", time / 1e9);
}
с каждым файлом, записанным на диск, они занимают примерно одинаковое количество времени каждый.
Took 7.7 seconds to write 1 GB
Took 7.5 seconds to write 1 GB
Took 7.7 seconds to write 1 GB
Took 7.9 seconds to write 1 GB
Took 7.6 seconds to write 1 GB
Took 7.7 seconds to write 1 GB
Однако, если я закомментирую map.force();
, я увижу этот профиль.
Took 0.8 seconds to write 1 GB
Took 1.0 seconds to write 1 GB
Took 4.9 seconds to write 1 GB
Took 7.2 seconds to write 1 GB
Took 7.0 seconds to write 1 GB
Took 7.2 seconds to write 1 GB
Took 7.2 seconds to write 1 GB
Похоже, что он буферизует около 2,5 ГБ, что составляет около 10% от моего основногопамяти до того, как она замедлится.
Вы можете очистить кэш, дождавшись завершения предыдущих записей.
В основном у вас есть 1 ГБ данных и постоянная скорость записи вашего диска.кажется, около 60 МБ / с, что является разумным для жесткого диска SATA.Если вы получаете скорость выше этой, то это потому, что данные на самом деле не записаны на диск и фактически находятся в памяти.
Если вы хотите, чтобы это было быстрее, вы можете использовать файл отображения памяти.Это дает преимущество записи на диск в фоновом режиме, так как вы заполняете «массив», т. Е. Запись может быть завершена почти сразу после завершения установки значений.
Другой вариант - получить более быстрый накопитель.Один 250 ГБ SSD-накопитель может поддерживать скорость записи около 200 МБ / с.Использование нескольких дисков в конфигурации RAID также может увеличить скорость записи.