为什么磁盘读取会比使用创build许多小文件的简单Java应用程序写入更重?

我有一个非常简单的Java 7应用程序,它从位于磁盘xvdb上的专有文件格式(Hadoop序列文件)中读取,并在磁盘xvdb创build了数以百万计的2-20kb文件。

  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) 

创build文件需要首先确定该文件是否已经存在。 由于这些文件非常小,所以读取元数据以确定创build文件的方式和位置超出了创build文件后所做的微小写入。

如果您熟悉数据结构,可以将一个小小的叶节点添加到二叉树,B树或类似的结构中。 你要做大量的阅读来确定叶节点在哪里,它是否已经在树中,等等。 这将比叶节点中的less量数据大得多。