Java - 最佳的打开大量文件并搜索单词的方式是什么?

3

我正在搜索一个包含大约450个文件的目录,每个文件大小约为20kb。以下是我的方法:

public void search(String searchWord) throws IOException
{
    this.directoryPath = FileSystems.getDefault().getPath(this.directoryString);
    this.fileListStream = Files.newDirectoryStream(this.directoryPath);
    int fileCount = 0;
    for(Path path : this.fileListStream)
    {
        String fileName = path.getFileName().toString();
        if(!fileName.startsWith("."))
        {
            BufferedReader br = Files.newBufferedReader(path, Charset.defaultCharset());
            String line;
            while((line = br.readLine()) != null)
            {
                System.out.println(fileName + ": " + line);
            }
            fileCount++;
            br.close();
        }
    }

    System.out.println("File Count: " + fileCount);
}

我的目标是逐字逐句地查找searchWord的匹配项,并打印出行号和找到它的文件名。
我的问题是,我想知道是否应该将行拆分为数组,并在数组中搜索单词并将其添加到列表中。还是应该将整个文件扫描到一个单词数组中,然后搜索单词并将其添加到列表中?或者这甚至无关紧要?如果有更好的方法,请让我知道!由于资源有限,我正在尽可能高效地完成此操作。

除非必要,否则不应将任何内容保存到数组中。只需在读取“文件”时检查单词是否等于您的“searchWord”。 - 3kings
你可以获胜的地方不在于使用朴素搜索,而是像Aho-Corasick算法一样,将搜索字符串预编译成一个结构,然后用它来高效地遍历所有文件。 - biziclop
2
为什么不尝试使用Apache Solr呢? - Keval
1
如果文件按字母顺序组织,您可以使用更高效的搜索算法。 - jthort
如果你需要在同一个文件中执行多个不同单词的搜索,那么索引(词汇表)就是适合的方法。所以并没有单一的最佳方法,有许多方法对于某些情景是好的,但对于其他情景则并非如此。 - biziclop
2个回答

1

不应该逐字逐句地查找,而是将整行作为字符串阅读,然后使用String.indexOf()方法查找该行是否包含该单词。


谢谢。我不知道为什么我没想到这个。这个完美地工作了,而且对于我正在处理的项目来说并不过度。 - johnslay

-1
你可以使用Scanner类来解析文件,并使用它的next()方法读取每个单词,这样就不需要任何数组或其他存储。如果可能的话,请尝试为每个文件使用多线程,这甚至可以提高性能。

一般而言,多线程并不能加速IO绑定的进程,事实上它可能会使它们变得更慢。 - biziclop
这取决于系统。举个例子,“I/O bound”只是意味着“一个线程大部分时间都在等待I/O完成,而不是使用CPU”,但并不意味着“我们已经达到了系统的I/O带宽限制”,所以我认为使用多个线程(或异步I/O)可能会提高性能(通过允许多个并发的I/O操作)。 - Snehit Gajjar
这就是为什么我说这只是一个一般规则。它并不总是奏效,但通常情况下,当您尝试同时读取位于不同位置(但在同一磁盘上)的文件时,磁盘I/O会恶化。 - biziclop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接