想象一下,我有一个非常大的文本文件。性能真的很重要。
我要做的就是扫描它以查找某个字符串。也许我想数一数我有多少,但这真的不是重点。
关键是:最快的方法是什么?
我不在乎维护它需要快速。
快速是关键。
想象一下,我有一个非常大的文本文件。性能真的很重要。
我要做的就是扫描它以查找某个字符串。也许我想数一数我有多少,但这真的不是重点。
关键是:最快的方法是什么?
我不在乎维护它需要快速。
快速是关键。
将整个文件加载到内存中,然后使用诸如Knuth Morris Pratt之类的字符串搜索算法进行查看。
编辑:
一个快速的谷歌显示这个字符串搜索库似乎已经实现了一些不同的字符串搜索算法。请注意,我从未使用过它,因此无法保证。
我想说你能得到的最快的将是在 FileInputStreams 之上使用 BufferedInputStreams ......或者如果你想避免 BufferedInputStream 实例化,则使用自定义缓冲区。
这将比我更好地解释它:http: //java.sun.com/developer/technicalArticles/Programming/PerfTuning/
这取决于您是否需要对每个文件进行多次搜索。如果您只需要进行一次搜索,请从磁盘中读取文件并使用 Michael Bogwart 建议的工具对其进行解析。如果您需要进行多次搜索,您可能应该使用Lucene之类的工具构建文件索引:读入文件,对其进行标记,将标记粘贴到 index.html 中。如果索引足够小,请将其放在 RAM 中(Lucene 提供 RAM 或磁盘支持的索引选项)。如果不保存在磁盘上。如果它对于 RAM 来说太大并且您非常非常关心速度,请将您的索引存储在固态/闪存驱动器上。
使用正确的工具:全文搜索库
我的建议是做一个内存索引(或启用缓存的基于文件的索引),然后对其执行搜索。正如@Michael Borgwardt建议的那样,Lucene 是目前最好的库。
我不知道这是否是一个愚蠢的建议,但 grep 不是一个非常有效的文件搜索工具吗?也许你可以使用它来调用它Runtime.getRuntime().exec(..)
无论具体情况如何,内存映射 IO 通常都是答案。
编辑:根据您的要求,您可以尝试将文件导入 SQL 数据库,然后通过 JDBC 来利用性能改进。
Edit2:JavaRanch的这个线程有一些其他的想法,涉及 FileChannel。我认为这可能正是您正在搜索的内容。