java - 针对小文件优化Java的NIO

标签 java optimization file-io nio

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

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

对此的最佳策略是什么?数据位于 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) channel 。 Esp 文件 channel (2) 聚集/分散。 (3) 直接缓冲 (4) 内存映射缓冲区 (5) 多线程 - 使用一堆可调用对象同时访问多个文件。 (6) 将文件包装在一个大文件中。 (7)其他我还没想到的。

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

额外问题:在上面的代码片段中,JVM 何时真正“访问磁盘”并读取文件内容,是 [1] 还是只是一个“指向”对象的文件处理程序?延迟评估有点有意义,但我不知道 ImageIO 类的实现是如何工作的。

最佳答案

ImageIO.read(imageFile)

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

关于java - 针对小文件优化Java的NIO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22095733/

相关文章:

c - gcc __builtin_expect 似乎没有生成正确的代码

c++ - 虚函数和性能 - C++

java - 如何读取文件的内容?

python - 如何忽略文件中的无效行?

android - 在 Android 平板电脑 (3.1) 的内存中写入和读取图像时遇到问题

java - 如何将类型化查询转换为条件生成器对象?

java - 如何布局2个按钮

java - 使用 Encog 机器学习框架进行简单的数字序列预测

regex - 优化这个可怕的正则表达式