У меня есть очень простое приложение 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-дерево или аналогичную структуру. Вам придется много читать, чтобы выяснить, куда идет листовой узел, находится ли он уже в дереве и т. Д. Это будет намного больше, чем крошечный объем данных в листовом узле.