2012-11-28 33 views
1

我有一個程序,讀取文件的每一行,提取數據根據特定的格式,由正則表達式定義。我可以調用Match()針對文件的全部內容,而不是多次調用Match()。哪一種更有效的解決方案?使用正則表達式從文件中提取數據 - 一次匹配行或整個文件?

後面的選擇將需要RegexOptions.Multiline選項。

更新:

該文件是由最終用戶指定的,以便它可以是大的(〜37000線,〜2MB)。每行都沒有必要包含有效的條目。

我正在使用的正則表達式是^\s*(OPTL_\w*)\s*=>\s*(\d+)\s*$。例如,這將匹配由文本OPTL_Example => 123組成的行,但不匹配由文本FooBar => 999組成的行。

+0

這是一個非常大的文件嗎? – Diego

+0

請嘗試改進您的問題。您有什麼'嘗試'!.be'特定'...給'示例' – Anirudha

+0

您有關於您的平均文件大小的任何度量標準嗎?這是你應該優化的。 –

回答

2

因此取決於您是否針對速度或穩定性進行了優化。

如果這是一個最終用戶的應用程序,並沒有控制文件大小或內存,那麼我會採取安全路線並逐行閱讀以保護內存。清楚地在循環外部建立正則表達式,所以你只需要在循環中調用.Match。 ReadLine非常快。

可以設置一些並行處理,以便在執行解析時讀取下一行。但是那個簡單的正則表達式太快了,不知道它會更快。一次或整行文件磁盤IO讀取文件最有可能是最慢的操作。

如果這是一個服務器應用程序,其分佈有限且速度很關鍵,那麼請全部閱讀。

+0

我的5美分::只有2MB的數據我不會考慮使用並行處理。這將是一個沒有任何改進的資源束縛。由於多線程管理,它實際上可能會變慢。 –

+0

@omega但沒有2 MB的保證。文件由用戶指定,用戶可以做奇怪的事情。並且你不能確定沒有可能通過並行進行改進。我懷疑沒有,但如果他們在4.5上,它並行效率會很高。 – Paparazzi

+0

一個選項可能是在處理之前檢查文件的大小,並根據該選項決定是否使用並行處理。 –

0

這取決於您需要的內存限制。如果您有多個正則表達式可以在整個文件上運行,那麼將整個文件保存在內存中效率更高。然而,如果你的正則表達式修改行(然後重複這個過程,使用相互依賴的級聯正則表達式),我會逐行解決。

0

選擇逐行解決方案可能允許您並行運行正則表達式。 問題是如果所有的並行處理開銷都是值得的。 如果你的正則表達式很複雜,並且/或者你做了一些其他的線處理,那麼可以並行運行,至少我會嘗試它。

1

它沒有一般的和/或正確的答案,因爲它取決於很多因素。主要的一個我的速度你的I/O。你爲什麼不測試兩種解決方案?如果大小爲2MB,我希望能夠使整個內容更快更高效。

相關問題