我试图从一个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