为什么对于创建许多小文件的简单 Java 应用程序来说,磁盘读取比写入更重?

为什么对于创建许多小文件的简单 Java 应用程序来说,磁盘读取比写入更重?

我有一个非常简单的 java 7 应用程序,它从磁盘上的专有文件格式(Hadoop 序列文件)读取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)

答案1

创建文件需要先确定该文件是否已存在。由于这些文件非常小,因此读取元数据以确定如何以及在何处创建文件比创建文件后进行的微小写入要多。

如果您熟悉数据结构,请考虑将一个微小的叶节点添加到二叉树、B 树或类似结构中。您将阅读大量资料来弄清楚叶节点的位置、它是否已经在树中等等。这将比叶节点中的微小数据量大得多。

相关内容