Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在300万个文本文件中搜索匹配项_Java_File Io - Fatal编程技术网

Java 在300万个文本文件中搜索匹配项

Java 在300万个文本文件中搜索匹配项,java,file-io,Java,File Io,我有一个简单的要求,用户输入一堆单词,系统扫描超过300万个文本文件,找到包含这些关键字的文件。在没有复杂的搜索/索引算法的情况下,实现这一点最有效、最简单的方法是什么 我曾想过为此使用Scanner类,但对如此大的文件的性能一无所知。性能不是很高的优先级,但应该达到可接受的标准 它应该在一个可接受的标准 我们不知道什么是可接受的标准。如果我们谈论交互式用户,可能不会有一个简单的解决方案,可以扫描300万个文件并在小于5秒的时间内返回一些内容 一个合理的解决方案是建立一个搜索索引,可能基于 基于

我有一个简单的要求,用户输入一堆单词,系统扫描超过300万个文本文件,找到包含这些关键字的文件。在没有复杂的搜索/索引算法的情况下,实现这一点最有效、最简单的方法是什么

我曾想过为此使用
Scanner
类,但对如此大的文件的性能一无所知。性能不是很高的优先级,但应该达到可接受的标准

它应该在一个可接受的标准

我们不知道什么是可接受的标准。如果我们谈论交互式用户,可能不会有一个简单的解决方案,可以扫描300万个文件并在小于5秒的时间内返回一些内容

一个合理的解决方案是建立一个搜索索引,可能基于

基于scanner/grep/find等的解决方案的主要问题是速度慢,无法扩展,而且昂贵的扫描工作必须一次又一次地完成(除非存储中间结果……但这并不简单,而且基本上是索引器的一个人工昂贵的重新实现)。当只使用索引时,索引的创建和更新是昂贵的,查询是廉价的

在没有复杂的搜索/索引算法的情况下,实现这一点最有效、最简单的方法是什么

复杂的搜索/索引算法。这里没有必要重新发明轮子。由于用户可以输入任何单词,因此您不能进行简单的预处理步骤,而是必须为文本中的所有单词编制索引。这就是Lucene为你做的事情

除了对文本进行预处理并建立索引之外,没有其他快速的方法来搜索文本。您可以为此推出自己的解决方案,也可以使用Lucene


没有预处理的简单文本搜索速度太慢,没有任何用处。

为什么不包装对grep的系统调用?您可以通过运行时类实现这一点。

在解析每个文本文件时,我将使用
BufferedReader
并检查每行文本是否匹配

BufferedReader br = new BufferedReader(new FileReader(file));
String line;
while ((line = br.readLine()) != null) {
   // Does this line containe the text?
   if(line.contains(text)) {
      System.out.println("Text found");
   }
}
br.close();

我不确定这对于如此庞大的文件数量是否会非常快。

在没有复杂的搜索/索引算法的情况下,实现这一点最有效、最简单的方法是什么

如果您不使用任何类型的索引算法,那么每次提交搜索时,您都需要读取每个文件。这样做的开销不在于“匹配”算法,而在于I/O延迟。所以,我不会太在意用什么来匹配<代码>扫描仪是一个简单的选择


如果要提高性能,需要使用某种预处理。如果大小允许,您可以将文件加载到内存中。您可以为每个文件(索引)创建一组单词。有太多的算法供您搜索,尤其是在Map/Reduce上下文中的“单词计数”示例。如果您想实现更高并发性,您还可能需要查看java的<代码>叉/连接>代码>框架。

您可能需要考虑将关键字存储在数据库中,并使用该方法查找匹配。我将认真考虑使用数据库来实现这种方法,数据库将根据性能进行优化。你还说有300万个文本文件,但后来你注意到在如此大的文件上的性能,你是说这里有大量的文件吗?
Scanner
方法可能适用于正常大小的文件,但我认为会影响性能。将有300多万个文件。每一个都有大约14000个自然语言单词为什么“没有复杂的搜索/索引算法”?定义复杂的,特别是为什么你有这样的约束?当你在做这件事时,什么是“可接受的标准”性能?客户在3或4个工作日内收到回复?:DGrep可能在系统上不可用,在windows上部署时就是这样。Grep也会比一个合适的索引慢。确实,索引会更快。但grep也可以在Windows上使用,如果性能不是高优先级的话,它将是一个更快的开发。而且你仍然可以并行化你的grep调用。grep只有在你特意安装的情况下才能在windows上使用。除非你对你的目标系统负责,否则你不能指望它在你的目标系统上可用。谢谢大家。我决定用solr来编制索引。这会非常慢。