我試圖從一個java程序創建300M文件,我從舊的文件API切換到新的java 7 nio包,但是新的包會去甚至比舊的還要慢。Java 7的nio.file包在創建新文件時速度很慢
我看到的CPU利用率比我在使用舊的文件API時少,但是我正在運行這個簡單的代碼,並且我獲得了0.5Mbytes/sec的文件傳輸速率,而且來自java的寫入正在讀取一個磁盤並寫入另一個(寫入是訪問磁盤的唯一進程)。
Files.write(FileSystems.getDefault().getPath(filePath), fiveToTenKBytes, StandardOpenOption.CREATE);
有沒有希望在這裏獲得合理的吞吐量?
更新:
我拆包從大文件中3億5-10K字節的圖像文件。我有3個磁盤,1個本地和2個SAN連接(大文件上的典型吞吐速率約爲20MB /秒)。
我也試過這個代碼,它將速度提高到幾乎不到2MB/sec的吞吐量(解壓這些文件需要9天的時間)。
ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, (BytesWritable)value).getLength());
FileOutputStream fos = new FileOutputStream(imageFile);
fos.getChannel().write(byteBuffer);
fos.close();
我從本地磁盤讀取並寫入SAN連接的磁盤。我從Hadoop SequenceFile格式讀取數據,hadoop通常可以使用基本相同的代碼以20MB /秒的速度讀取這些文件。
唯一不合適的地方,除了超級慢,我看到更多的讀取IO,而不是寫入IO大約2:1,儘管序列文件是gziped(圖像實際上是1:1的比例雖然),所以壓縮文件應該是大約。 1:1與輸出。
月2日更新
看着iostat
我看到一些奇數,我們正在尋找xvdf在這裏,我有一個java程序從xvdb
讀取和寫入xvdf
並沒有ohter流程活躍xvdf
iostat -d 30
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
xvdap1 1.37 5.60 4.13 168 124
xvdb 14.80 620.00 0.00 18600 0
xvdap3 0.00 0.00 0.00 0 0
xvdf 668.50 2638.40 282.27 79152 8468
xvdg 1052.70 3751.87 2315.47 112556 69464
的讀取xvdf
是10X的寫入,這是令人難以置信的。
fstab
/dev/xvdf /mnt/ebs1 auto defaults,noatime,nodiratime 0 0
/dev/xvdg /mnt/ebs2 auto defaults,noatime,nodiratime 0 0
這些文件有多大? – parsifal 2013-03-15 14:07:57
@parsifal「我想創建300M文件[0123]」 – Puce 2013-03-15 14:14:48
我讀爲「我試圖創建300萬(或千)文件」,而不是「我試圖創建一個文件,這是300 Mb的大小「(否則,爲什麼使用」M「而不是」Mb「?)。 – parsifal 2013-03-15 14:15:43