Javaプログラムから3億個のファイルを作成しようとしていますが、古いファイルAPIから新しいjava 7 nioパッケージに切り替えましたが、新しいパッケージは古いパッケージよりもさらに遅くなります。
古いファイルAPIを使用していたときよりもCPU使用率が低くなっていますが、この単純なコードを実行していると、0.5Mバイト/秒のファイル転送速度が得られ、Javaからの書き込みは1つのディスクを読み取り、別の(書き込みはディスクにアクセスする唯一のプロセスです)。
Files.write(FileSystems.getDefault().getPath(filePath), fiveToTenKBytes, StandardOpenOption.CREATE);
ここで妥当なスループットを得る希望はありますか?
アップデート:
大きなファイルから3億の5-10kバイトの画像ファイルを解凍しています。私は3つのディスクを持っており、1つはローカルで2つはSANが接続されています(すべて、大きなファイルで最大20MB /秒のスループットレートがあります)。
また、速度を2MB /秒未満のスループット(これらのファイルを解凍するのに9日)に改善するこのコードを試しました。
ByteBuffer byteBuffer = ByteBuffer.wrap(imageBinary, 0, (BytesWritable)value).getLength());
FileOutputStream fos = new FileOutputStream( imageFile );
fos.getChannel().write(byteBuffer);
fos.close();
ローカルディスクから読み取り、SANに接続されたディスクに書き込みます。私はHadoopSequenceFile形式から読み取っていますが、hadoopは通常、基本的に同じコードを使用して20MB/秒でこれらのファイルを読み取ることができます。
非常に遅いことを除いて、場違いに見える唯一のことは、シーケンスファイルがgzipされているにもかかわらず、書き込みIOよりも読み取りIOが約2:1多いことです(ただし、画像は実質的に1:1の比率になります)。圧縮ファイルは約である必要があります。出力と1:1。
2回目の更新
iostat
いくつかの奇数が表示されています。ここではxvdfが表示されています。読み取りと書き込みを行うJavaプロセスが1つありxvdb
、xvdf
他のプロセスはアクティブではありません。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
は書き込みの10倍であり、信じられないほどです。
fstab
/dev/xvdf /mnt/ebs1 auto defaults,noatime,nodiratime 0 0
/dev/xvdg /mnt/ebs2 auto defaults,noatime,nodiratime 0 0