3

我有一个大文件,其中包含诸如“ABCDEabcde .....XYZxyz”之类的字符序列。现在,我想从中提取一些子序列字符串。例如,从第 10 个字符到第 50 个字符串,从第 15 个字符到第 55 个字符串(所有子序列字符串具有相同的长度,即 40 个字符并且起始位置(例如 10,15)总是增加)。子序列位置在一次运行中从第 10 到第 50 个字符、从第 15 到 55 个字符、在另一运行中从第 2 到第 42 个字符和从第 100 到第 140 个字符是动态的。现在,我必须提取数百万个这样的动态子字符串。我已经尝试了一些在这里向我建议的方法。但是,它们对我来说很慢。

我努力了:

1)使用BufferedReader进行简单的缓冲读取,等待需要的位置块。

2)使用随机访问文件和搜索方法来做到这一点。

由于我的文件大约 700 mb(近 2 亿个字符)并且我必须提取数百万个这样的动态子字符串,因此它们对我来说需要将近一分钟(第一个需要更多时间)。任何人都可以通过提供任何其他可能比它更快的想法来帮助我吗?我也可以使用任何 Java 库。

4

2 回答 2

2

您可以做的最有效的事情可能是将整个文件映射到内存中。基本上:

FileChannel channel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());

我认为没有什么比你可以尝试的更有效的方法了——现代操作系统很好地优化了内存映射文件。

于 2012-04-28T14:29:52.747 回答
0

我认为最快的方法是将整个文件加载到内存中并从那里提取所需的子字符串。它会消耗大量内存,但速度会快得多(这是您的目标)。

于 2012-04-28T14:32:24.593 回答