Java- 从文件中动态提取子字符串 - 快速方法

标签 java guava

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

我试过:

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

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

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

最佳答案

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

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

我不认为您可以尝试更高效的方法 - 现代操作系统可以很好地优化内存映射文件。

关于Java- 从文件中动态提取子字符串 - 快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10364370/

相关文章:

java - Jacoco ant 任务 - 没有 jacoco.exec 输出

java - 应该使用哪个类在 java 中创建 TLS 连接。套接字类或 SSLSocket 类?

java - compressionMinSize 不适用于 Tomcat 6

Java 集合 - 如何在集合中添加多个值?

java - Guava 缓存 : cacheloader vs get(k, 可调用)

java - jtable 中整行的删除线

java - jhipster 应用程序中 application-prod.yml 和 application-dev.yml 之间的区别

java - 如何创建新的转发缓存?

java - 在 GWT 应用程序中包含 Guava GWT

java - 如何在 Eclipse 中为 Guava 的 ArrayListMultiMap 类创建 JUnit 测试用例?