我有一个大文件,其中包含“ABCDEabcde ..... XYZxyz”等字符序列。现在,我想从中提取一些子序列字符串。例如,从第10个字符到第50个字符串,从第15个字符到第55个字符串(所有子序列字符串具有相同的长度,即40个字符和起始位置(例如10,15)总是增加)。子序列位置是从10到50个字符,从15到55个字符,在从第2个到第42个字符和从第100个到第140个字符的另一个运行中的一次运行中的动态装置。现在,我必须提取数百万这样的动态子字符串。我已经尝试了一些我建议的方法here。但是,对我来说它们很慢。
我试过了:
1)使用BufferedReader进行简单的缓冲读取,并等待所需的位置块。
2)使用Random Access File和Seek方法来做到这一点。
由于我的文件大约是700 mb(近2亿个字符)而且我必须提取数百万个这样的动态子字符串,所以它们花了将近一分钟(第一个需要更多)。任何人都可以通过提供可能比它更快的任何其他想法来帮助我吗?使用任何Java库对我来说也没关系。
答案 0 :(得分:2)
您可以做的最有效的事情是将整个文件映射到内存中。基本上是:
FileChannel channel = new RandomAccessFile(file, "r").getChannel();
ByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
我认为你可以尝试的效率更高 - 现代操作系统可以很好地优化内存映射文件。
答案 1 :(得分:0)
我认为最快的方法是将整个文件加载到内存中并从那里提取所需的子字符串。它会占用大量内存,但会更快(这就是你的目标)。