繁体   English   中英

什么是在java中扫描非常大的文件的最快方法?

[英]what's the fastest way to scan a very large file in java?

想象一下,我有一个非常大的文本文件。 表现真的很重要。

我想要做的就是扫描它以寻找某个字符串。 也许我想算一下我有多少,但这不是重点。

关键是:什么是最快的方式?

我不关心它需要快速的维护。

快速是关键。

对于一次性搜索,请使用扫描仪 ,如此处所示

一种比indexOf()快得多的简单技术是使用Scanner,方法是findWithinHorizo​​n()。 如果使用带有File对象的构造函数,Scanner将在内部创建一个FileChannel来读取该文件。 对于模式匹配,它最终将使用Boyer-Moore算法进行有效的字符串搜索。

首先,使用nio( FileChannel )而不是java.io类。 其次,使用像Boyer-Moore这样的高效字符串搜索算法

如果你需要为不同的字符串多次搜索同一个文件,你需要构建某种索引,所以看看Lucene

将整个文件加载到内存中,然后使用字符串搜索算法(如Knuth Morris Pratt)查看。

编辑:
一个快速谷歌显示这个字符串搜索库似乎已实现了一些不同的字符串搜索算法。 注意我从来没有用过它所以不能担保它。

无论具体是什么,内存映射IO通常都是答案。

编辑:根据您的要求,您可以尝试将文件导入SQL数据库,然后通过JDBC利用性能改进。

Edit2:JavaRanch的这个主题有一些其他的想法,涉及FileChannel。 我想这可能正是你在寻找的东西。

我说你可以获得最快的将是在FileInputStreams之上使用BufferedInputStreams ...或者如果你想避免BufferedInputStream实例化,可以使用自定义缓冲区。

这将比我更好地解释: http//java.sun.com/developer/technicalArticles/Programming/PerfTuning/

使用正确的工具:全文搜索库

我的建议是在内存索引(或启用了缓存的基于文件的索引)中执行,然后对其执行搜索。 正如@Michael Borgwardt所说,Lucene是那里最好的图书馆。

我不知道这是不是一个愚蠢的建议,但是不是一个非常有效的文件搜索工具吗? 也许你可以使用Runtime.getRuntime().exec(..)来调用它Runtime.getRuntime().exec(..)

这取决于您是否需要为每个文件执行多个搜索。 如果只需要进行一次搜索,请从磁盘中读取文件并使用Michael Bogwart建议的工具进行解析。 如果你需要进行多次搜索,你应该使用像Lucene这样的工具构建文件的索引:读取文件,标记它,在索引中粘贴标记。 如果索引足够小,请将其放在RAM中(Lucene提供RAM选项或磁盘支持索引)。 如果不保留在磁盘上。 如果它对于RAM来说太大而且您非常非常非常关注速度,请将索引存储在固态/闪存驱动器上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM