2010-10-21 65 views
9

我正在研究大約1GB的增量文件,我想搜索特定的模式。 目前我正在使用Java正則表達式,你有什麼想法,我怎麼能更快地做到這一點?模式搜索如何更快地完成?

+2

這樣的聲音應該是I/O限制的。只讀取(並丟棄)文件內容的程序運行速度有多快?正則表達式應該能夠達到相同的速度,否則就會出現問題(如緩衝)。如果簡單地閱讀文件對於您的目的來說太慢,那麼您需要考慮一種不同的方法(參見以下關於Lucene的討論)。 – 2011-06-06 03:12:20

+0

你可以顯示圖案和一些文件。也許表達很慢,因爲它不是最佳的。你的程序是否將文件的全部內容加載到字符串中,然後運行正則表達式?這是否是緩慢的部分? – 2011-06-10 12:10:47

回答

7

基本上你需要的是一個可以處理流的狀態機。這個流被綁定到文件中。每次文件增長時,都會讀取附加到該文件的內容(如尾部linux命令附加到標準輸出的文件中添加的行)。

如果您需要停止/重新啓動分析儀,您可以將其存儲在起始位置的某個位置(可以取決於模式匹配所需的窗口),然後重新啓動。或者你可以重新開始。

這是針對「增加文件」部分的問題。

對於處理內容的最佳方式,它取決於您真正需要什麼,需要應用什麼樣的數據和模式。正則表達式可能是最好的解決方案:靈活,快速和相對方便。

從我的理解來看,如果你想爲某些自然語言內容做文檔搜索匹配,Lucene會很好。這將是一個很差的選擇,以匹配所有日期或所有行與特定的屬性。另外,因爲Lucene首先創建文檔的索引......這將僅對於處理非常重的處理有幫助,因爲首先索引需要時間。

8

聽起來像Apache Lucene的工作。

你可能不得不重新考慮你的搜索策略,但是這個庫是用來做這樣的事情並且增量地添加索引。

它通過建立你的數據的反向索引(用Lucene的說法是文檔),然後快速檢查反向索引中哪些文檔有你的模式的一部分。

您可以使用文檔索引存儲元數據,這樣您就不必在大多數用例中查閱大文件。

+0

我解析的文件正在逐漸增加。有可能做索引。我剛剛發現正則表達式較慢。我必須使用像湯姆森NFA這樣的東西。 – Kamahire 2010-10-21 15:20:26

+0

感謝彼得的及時回覆。如何使用Lucern相同?你能給我一些樣品嗎? – Kamahire 2010-10-21 15:21:33

+0

Lucene適合用自然語言處理文本數據。根據文件格式和模式的不同,這可能不是最佳解決方案。 – 2011-06-05 13:14:11

4

您可以嘗試使用模式和匹配器類來使用編譯的表達式進行搜索。

http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.htmlhttp://download.oracle.com/javase/tutorial/essential/regex/

或使用您喜歡的搜索引擎上的條款搜索:

Java正則表達式優化

Java正則表達式的性能

+0

我已經優化了正則表達式。我已經刪除了回溯。 – Kamahire 2010-10-21 15:35:13

+1

這是否讓它更快? – 2010-10-30 00:27:50

4

我認爲這取決於:

  • 你的數據結構(面向行?)
  • 在其數據文件越來越大

如果你的數據是面向行的比賽

  • 速度的複雜性(或面向塊),並且匹配必須出現在您可以匹配的單元內,直到最後一個完整塊爲止,並存儲該端點的文件位置。下一次掃描應該從該端點開始(可能使用RandomAccessFile.seek())。

    如果數據沒有快速增長,這特別有用。

    如果您的匹配非常複雜,但具有明顯的固定文本,並且模式不會經常發生,您可以使用String.contains()函數更快地執行此操作,並且只有在true時才應用該模式。由於模式趨向於高度優化,因此絕對不能保證更快。

    你甚至可能會想通過手工編寫一個解析器來替換正則表達式,可能是基於StringTokenizer或者其他的。這確實有很多工作要做,但它可以讓您將關於數據的額外情報傳遞給解析器,從而使其快速失敗。如果您真的瞭解很多關於您無法在模式中進行編碼的數據,這只是一個不錯的選擇。