Назад | Перейти на главную страницу

Почему чтение с диска будет тяжелее, чем запись с помощью простого Java-приложения, которое создает много небольших файлов?

У меня есть очень простое приложение java 7, которое читает из проприетарного формата файла (файл последовательности Hadoop), находящегося на диске xvdb и создает на диске миллионы файлов размером 2-20 КБ xvdf.

  ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, ((BytesWritable)value).getLength());
  File imageFile = new File(filePath);
  FileOutputStream fos = new FileOutputStream( imageFile );
  fos.getChannel().write(byteBuffer);
  fos.close();

Бег iostat -d 30 показывает, что мы делаем больше, чем двойное чтение с диска, чем запись. На этом томе нет других действий, кроме приложения, указанного выше. только запись на этот диск.

  Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
  xvdap1            0.40         0.00         3.07          0         92
  xvdb             19.90       828.67         0.00      24860          0
  xvdap3            0.00         0.00         0.00          0          0
  xvdf            988.93      3538.93      1385.47     106168      41564

варианты крепления:

  /dev/xvdf on /mnt/ebs1 type ext4 (rw,noatime,nodiratime)

Для создания файла необходимо сначала определить, существует ли этот файл уже. Поскольку эти файлы очень малы, чтение метаданных для определения того, как и где создать файл, превышает крошечную запись, сделанную после создания файла.

Если вы знакомы со структурами данных, подумайте о добавлении крошечного листового узла в двоичное дерево, B-дерево или аналогичную структуру. Вам придется много читать, чтобы выяснить, куда идет листовой узел, находится ли он уже в дереве и т. Д. Это будет намного больше, чем крошечный объем данных в листовом узле.