构建应用程序,仅适用于文件I / O(可以是pdf,jpg等)。最大文件大小可以是300MB。应用程序将部署在Linux 64位上。 试过传统的阻塞IO(FileOutputStream等)。但我正在寻找具有良好性能的非阻塞或更好的方法。
这是我现在正在使用的代码。
for (const [key, value] of mymap) {
console.log(key, value);
}
请帮助我使用更好的方法,代码片段来满足此方案。 休息服务将输入filemetada和bytestream作为我服务的输入。
答案 0 :(得分:0)
我建议使用内存映射文件。我们使用它们对数据集进行快速,共享的读/写访问,最大内存容量为40倍。
您可以使用RandomAccessFile中的计划MappedByteBuffer,或使用像我这样的库。
低级文件内存访问
仅在内存映射文件上构建的追加队列/日志。 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
,但不能,但不能。