Java中简单文件搜索的性能

时间:2012-02-21 18:39:12

标签: java performance file-io

我们运行一个必须从相当大的目录提供文件的网络服务器,因此通过简单的通配符搜索(如“abcd * jklp *”)查找文件会出现严重的性能问题。

有没有办法(技巧或库)加速Java中的文件搜索?如果没有,是否有一个简单的缓存解决方案,这样每次搜索只进行一次,除非应用程序显式清空缓存?

3 个答案:

答案 0 :(得分:2)

当您的Web应用程序启动时(之后每隔x分钟)缓存您打算在静态变量中提供的每个文件。当用户搜索特定文件时,搜索静态缓存而不是在实际文件服务器上运行搜索。

如果你只允许搜索文件名,那么缓存一切都很有效。您可以将每个文件路径存储在List / Array中。如果列表/数组已经排序,则可以使用二进制搜索进行用户搜索查询。如果有外卡,则生成适当的RegEx。

对于文件内容的全文搜索,静态存储它是不可行的。做一些懒惰的事情,比如用数据库备份文件或购买像GSA http://www.google.com/enterprise/search/gsa.html

这样的搜索设备

答案 1 :(得分:0)

搜索中的“技巧”是为初始查询提供尽可能多的信息。如果我所需的文件名为BobAndAlice,而我的输入字符串为B*,理论上它将比使用Bo*的搜索慢。为了讨论起见,缓存的工作原理是以类似于HashMap的方式构建查找表。从本质上讲,每次搜索都会在您提交的Query Map后进行检查,如果已经运行并且Cache Emptied标志设置为false,那么您将点击Lookup Table,这将是全部来自执行查询结果的指针。从而允许fast查找已检索的数据。如果您存储重复的文件副本而不是指向文件的指针,则可能遇到问题的地方。相同的过程对于实际向用户提供文件是有效的。

答案 2 :(得分:0)

这似乎不是Java问题。它更像是一个算法问题。我从这个问题中理解的是,您在给定目录中拥有大量文件,并且您需要使用通配符模式字符串来处理符合该条件的文件。这基本上是字符串匹配的问题,你有很多字符串,只需要找到符合特定条件的字符串。有很多选项你可以通过它来做这个,但是我会为这个场景建议后缀树的方法,因为它会在文件搜索中提供几乎o(n)的性能。