2012-02-21 24 views
1

簡單filesearch的我們運行必須從一個相當大的目錄服務文件的網絡服務器,通過一個簡單的通配符搜索,如「ABCD * jklp *」所以找到該文件有嚴重的性能問題。性能在Java中

有沒有一種方法(一招或庫),以加快在Java中文件搜索?如果沒有,是否有一個簡單的緩存解決方案,這樣每個搜索只能完成一次,除非應用程序顯式清空緩存?

+1

是否可以緩存樹或目錄中的所有文件?在操作系統上查找樹中匹配的文件名可能會快得多。 – 2012-02-21 18:55:44

+0

好主意,我會研究它。 – 2012-02-23 08:04:08

回答

2

當你的Web應用程序啓動(以及以後每個x分鐘)隱藏每個文件你打算在一個靜態變量服務。當用戶搜索特定文件時,搜索靜態緩存而不是在實際的文件服務器上運行搜索。

如果您允許的所有功能都是搜索文件名,則緩存一切都會很好。您可以將每個文件路徑存儲在List/Array中。如果列表/數組已經排序,則可以使用用戶搜索查詢的二進制搜索。如果有通配符生成正確的RegEx。

對於全文搜索文件內容,將其全部靜態存儲將不可行。做一些懶惰像回到你的文件與數據庫或買一個搜索設備GSA一樣http://www.google.com/enterprise/search/gsa.html

+0

無需全文搜索文件內容。你是否建議在一個固定的timout上使緩存失效並完全重建它?這聽起來很划算...... – 2012-02-23 08:07:07

+0

@Tim van Beek - 比較昂貴嗎?搜索文件服務器上每個搜索請求的每個文件都很昂貴。您可以每X分鐘生成一個新的緩存或者從當前的靜態緩存中添加(新)/刪除(刪除)文件。但是您仍然需要重新遍歷文件服務器上的所有文件。 – 2012-02-23 12:12:23

+0

最後一句似乎回答我的問題,我很好奇,如果有文件系統上的更改通知機制,可以使用,而不是一會兒重新迭代一次。 – 2012-02-23 15:52:38

0

的「絕招」,在搜索提供的初始查詢儘可能多的信息成爲可能。如果我所需的文件名爲BobAndAlice,並且我的輸入字符串爲B*,那麼它理論上會比使用Bo*的搜索更慢。爲了討論的目的,緩存通過以類似於HashMap的方式構建查找表來工作。從本質上說每個搜索,一旦提交,將針對您的Query Map檢查,如果它已運行和Cache Emptied標誌被設置爲false,那麼你會打Lookup Table這將是所有從執行查詢的結果出來的指針。從而允許fast查找已檢索的數據。如果您存儲重複文件副本而不是指向該文件的指針,則可能遇到問題。相同的過程對於向用戶實際提供文件是有效的。

0

這似乎並不像一個Java的問題。它更像是一個算法問題。我從問題中瞭解到,您在給定目錄中有大量文件,並給出了需要處理符合該條件的文件的通配符模式字符串。這基本上是字符串匹配的問題,因爲你有很多字符串,只需要找到符合特定條件的字符串。有很多選項可以通過它來做到這一點,但是我會建議採用後綴樹,因爲它會在文件搜索中提供近乎o(n)的性能。