簡體   English   中英

實時解析大型文本文件(Java)

[英]Parsing Large Text Files in Real-time (Java)

我有興趣在Java(1.6.x)中解析一個相當大的文本文件,並想知道哪種方法被認為是最佳實踐?

該文件的大小可能約為1Mb,並且將包含數千個條目;

Entry
{
    property1=value1
    property2=value2
    ...
}

等等

我的第一直覺是使用正則表達式,但我之前沒有在生產環境中使用Java的經驗,所以我不確定java.util.regex類有多強大。

為了澄清一點,我的應用程序將成為一個Web應用程序(JSP),它解析有問題的文件並顯示它檢索的各種值。 只有一個文件被解析(它駐留在主機上的第三方目錄中)。

該應用程序的使用率相當低(可能只有少數用戶每天使用它幾次),但至關重要的是,當他們使用它時,會盡快檢索信息。

另外,每次解析文件時,是否有任何預防措施可以將文件加載到內存中?

誰能推薦一種方法來接受這里?

謝謝

如果它大概是1MB並且按你所聲明的格式,那么聽起來你就是過度工程。

除非您的服務器是ZX Spectrum或其他東西,只需使用正則表達式來解析它,敲擊哈希映射中的數據(並將其保留在那里),並且不用擔心它。 它會占用幾兆內存,但那又是什么......?

更新:為了讓您對性能有一個具體的了解,我對String.split() (使用正則表達式)的性能進行了一些測量,結果顯示在2GHz機器上, 分割10,000個100個字符的字符串需要幾毫秒換句話說,大約1兆字節的數據 - 實際上在純字節量中接近2MB,因為字符串是每個字符2個字節)。 很明顯,這不是你正在進行的操作,但你明白我的意思:事情並不是那么糟糕......

如果它是正確的語法,請使用解析器構建器,例如GOLD解析系統 這允許您指定格式並使用有效的解析器來獲取所需的令牌,幾乎可以免費獲得錯誤處理。

我想知道為什么這不是XML,然后你可以利用可用的XML工具。 我特別想到SAX,在這種情況下,您可以輕松地解析/處理它而不必將其全部保存在內存中。

那你可以把它轉換成XML嗎?

如果你不能,並且你需要一個解析器,那么看看JavaCC

使用Scanner類並一次處理一行文件。 我不確定你為什么提到正則表達式。 正則表達式幾乎永遠不是任何解析問題的正確答案,因為在什么情境下發生的模糊性和缺乏語法控制。

您可以使用Antlr解析器生成器來構建能夠解析文件的解析器。

沒有回答關於解析的問題......但是你可以在新文件到達時解析文件並生成靜態頁面。 所以你沒有性能問題...(我認為1Mb不是一個大文件所以你可以將它加載到內存中,只要你不同時加載太多文件......)

這看起來像一個簡單的文件格式,因此您可以考慮使用遞歸下降解析器 與JavaCC和Antlr相比,它的優點是你可以編寫一些簡單的方法,獲得所需的數據,而不需要學習解析器生成器的形式。 它的缺點 - 可能效率較低。 遞歸下降解析器原則上比正則表達式更強。 如果您可以為此文件類型提供語法,它將為您提供所選的任何解決方案。

如果這是您想知道的Java正則表達式的限制,請不要擔心。 假設你有能力制作正則表達式,性能應該不是問題。 功能集也非常豐富 - 包括我最喜歡的占有量詞

另一種解決方案是進行某種形式的預處理(離線完成或作為cron作業),它產生一個非常優化的數據結構,然后用於服務許多Web請求(無需重新解析文件)。

但是,看看有問題的情景,似乎並不需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM