我有一个非常简单的 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 树或类似结构中。您将阅读大量资料来弄清楚叶节点的位置、它是否已经在树中等等。这将比叶节点中的微小数据量大得多。