高性能文件I / O java API,文件大小为300MB(最大)

时间:2017-12-06 09:06:09

标签: java multithreading file-io io nio

构建应用程序,仅适用于文件I / O(可以是pdf,jpg等)。最大文件大小可以是300MB。应用程序将部署在Linux 64位上。 试过传统的阻塞IO(FileOutputStream等)。但我正在寻找具有良好性能的非阻塞或更好的方法。

这是我现在正在使用的代码。

for (const [key, value] of mymap) {
    console.log(key, value);
}

请帮助我使用更好的方法,代码片段来满足此方案。 休息服务将输入filemetada和bytestream作为我服务的输入。

2 个答案:

答案 0 :(得分:0)

我建议使用内存映射文件。我们使用它们对数据集进行快速,共享的读/写访问,最大内存容量为40倍。

您可以使用RandomAccessFile中的计划MappedByteBuffer,或使用像我这样的库。

低级文件内存访问

https://github.com/OpenHFT/Chronicle-Bytes/blob/master/src/test/java/net/openhft/chronicle/bytes/MappedMemoryTest.java

仅在内存映射文件上构建的追加队列/日志。 https://github.com/OpenHFT/Chronicle-Queue

基于内存映射文件构建的键/值存储。 https://github.com/OpenHFT/Chronicle-Map

  

作为参考,我使用的上述代码花了大约75ms来编写一个25Mb的pdf文件。

我认为你的意思是25 MB(兆字节)而不是Mb(Megabits),这意味着转换为333 MB / s,这对于单个桌面SSD来说是合理的。也就是说,问题很可能就是你在磁盘子系统可以做的极限下工作。

BTW您可以购买NVMe驱动器,其价格低于1000美元,可以达到2 GB / s。

答案 1 :(得分:-1)

您需要对现有代码执行的操作是使用BufferedOutputStream,因此:

OutputStream imageOutFile = new BufferedOutputStream(new FileOutputStream("path/filename"));

这将产生重大影响。

没有理由相信非阻塞API会更快,即使它存在于Java中的文件I / O,它也不存在。

如果您事先知道输出大小,可以使用MappedByteBuffer,但不能,但不能。