我有一个非常简单的 Java 7 应用程序,它从磁盘上的专有文件格式 (Hadoop sequencefile) 读取数据,并在磁盘上xvdb
创建数百万个 2-20kb 的文件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 树或类似结构中。您将进行大量阅读以找出叶节点的去向,它是否已经在树中,等等。这将远远大于叶节点中的少量数据。