针对小文件优化Java的NIO

时间:2014-02-28 12:50:30

标签: java optimization file-io nio

我们有文件I / O瓶颈。我们有一个包含大量JPEG文件的目录,我们希望将它们作为电影实时读取。显然这不是一种理想的格式,但这是一个原型对象跟踪系统,并且不可能改变格式,因为它们在代码的其他地方使用。

从每个文件中我们构建一个框架对象,它基本上意味着有一个缓冲图像和一个包含图像中所有信息的显式字节缓冲区。

最佳策略是什么?数据在SSD上,理论上读/写速率约为400Mb / s,但实际上使用简单的实现读取每秒不超过20个文件(3-4Mb / s):

bufferedImg = ImageIO.read(imageFile);[1]
byte[] data = ((DataBufferByte)bufferedImg.getRaster().getDataBuffer()).getData();[2]
imgBuf = ByteBuffer.wrap(data);

然而,Java为改进它提供了很多可能性。 (1)CHANnels。 Esp文件频道 (2)收集/散射。 (3)直接缓冲 (4)存储器映射缓冲器 (5)MultiThreading - 使用一堆callables同时访问多个文件。 (6)将文件包装在一个大文件中。 (7)我还没有想到的其他事情。

我想知道是否有人对各种选项进行了广泛测试,并知道什么是最佳选择?我认为(3)是必须的,但我仍然希望尽可能优化单个文件的读取,并且不确定最佳策略。

奖金问题:在上面截断的代码中,JVM何时实际“命中磁盘”并读入文件的内容,是[1]还是只是一个“指向”对象的文件处理程序?懒惰评估是有意义的,但我不知道ImageIO类的实现是如何工作的。

1 个答案:

答案 0 :(得分:0)

ImageIO.read(imageFile)

当它返回BufferedImage时,我认为它会命中磁盘而不是文件处理程序。