Java合并排序二进制文件

Java合并排序二进制文件,java,io,Java,Io,我有几个已排序的二进制文件,它们以某种可变长度格式存储信息(意味着其中一个段包含可变长度段的长度) 我需要将它们合并到一个排序文件中。我可以使用BufferedInputStream成功地实现这一点。然而,在机械磁盘上需要很长时间。在使用SSD的机器上,速度要快得多,正如预期的那样 困扰我的是,即使在SSD上,CPU利用率也非常低,这让我怀疑有办法提高速度。我假设这是因为CPU在磁盘上等待的大部分时间。我试图将缓冲区增加到数百MB,但没有效果 我曾尝试使用MemoryMapped缓冲区和文件通道

我有几个已排序的二进制文件,它们以某种可变长度格式存储信息(意味着其中一个段包含可变长度段的长度)

我需要将它们合并到一个排序文件中。我可以使用BufferedInputStream成功地实现这一点。然而,在机械磁盘上需要很长时间。在使用SSD的机器上,速度要快得多,正如预期的那样

困扰我的是,即使在SSD上,CPU利用率也非常低,这让我怀疑有办法提高速度。我假设这是因为CPU在磁盘上等待的大部分时间。我试图将缓冲区增加到数百MB,但没有效果

我曾尝试使用MemoryMapped缓冲区和文件通道,但它并没有改善运行时

有什么想法吗

编辑:使用MemoryMappedByteBuffer失败,因为合并的文件大小超过2 GB,这是MemoryMappedByteBuffer的大小限制。但即使在将较小的文件合并到GB文件之前,我也没有注意到速度或CPU利用率的提高


谢谢

也许您可以更好地压缩文件,或者这不是一个选项?如果瓶颈是I/O,那么减少数量是一个好的攻角。

多线程呢!?对于SSD,如果您的算法允许同时处理多个文件,这应该是一种改进。该程序将在带有机械磁盘的机器上运行。我犯了一个错误,在一台有不同类型磁盘的机器上测试和优化它。如果你编写一个程序只是读取文件,将它们写入输出,而不进行排序,那么速度会更快吗?如果不是,则瓶颈是I/O。您甚至可以在Java之外对其进行测试—在UNIX
time cat input1 input2 input3>output中,我无法进一步压缩数据,因为数据存储在磁盘中时需要对其运行搜索操作。它使用几种无损耗数据压缩方法进行压缩。