Linux
為什麼磁碟讀取比使用創建許多小文件的簡單 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)
創建文件需要首先確定該文件是否已經存在。由於這些文件非常小,讀取元數據以確定文件的創建方式和位置超過了創建文件後所做的微小寫入。
如果您熟悉資料結構,則可以將一個微小的葉節點添加到二叉樹、B 樹或類似結構中。您將進行大量閱讀以確定葉節點的去向,它是否已經在樹中,等等。這將遠遠大於葉節點中的少量數據。