基本上我想要做的是運行多個(15-25)正則表達式替換一個字符串上儘可能最好的內存管理。C#多個正則表達式替換字符串 - 內存太多
概述: 通過ftp附加到StringBuilder
來獲取非常大的字符串,僅流文本文件(有時爲html)。文件大小範圍從300KB到30MB。
正則表達式是半複雜的,但需要多行文件(例如識別書的某些部分),所以任意斷開字符串或在每個下載循環中運行替換都不在答案中。
樣本替換:
Regex re = new Regex("<A.*?>Table of Contents</A>", RegexOptions.IgnoreCase);
source = re.Replace(source, "");
用的每次運行更換內存的天空火箭,我知道這是因爲字符串在C#中不可改變的,它需要進行復制 - 即使我打電話GC.Collect()
它仍然不足以支持30MB文件。
任何關於更好的方法或執行多個正則表達式的方法都會使用常量內存(使2個副本(如此在內存中爲60MB),執行搜索,放棄拷貝回到30MB)?
更新:
似乎沒有成爲一個簡單的答案,但對於未來的人在看這個,我結束了使用下面的所有答案的組合來得到它可接受的狀態:
如果可能的話,將字符串拆分爲塊,請參閱manojlds的答案,以便在讀取文件時尋找合適的端點。
如果你無法拆分流,至少在可能的時候再拆分它 - 請參閱ChrisWue的一些外部工具的答案,這些工具可能有助於這個過程管道到文件。
優化正則表達式,避免貪婪的操作符,儘量限制引擎必須做的事 - 參見Sylverdrag的答案。
在可能的情況下合併正則表達式,這會減少正則表達式彼此不相互關聯時的替換次數(在這種情況下,用於清理錯誤的輸入) - 請參閱Brian Reichle對代碼示例的回答。
謝謝大家!
我打電話給每個正則表達式一次在字符串上,將編譯幫助的次數它做替換?就像在示例正則表達式中一樣,如果有500個匹配的目錄替換,編譯後的版本運行速度會更快嗎? – WSkid 2011-04-16 03:52:26
對不起,我意識到自己的錯誤,並刪除了我的評論,但當時您已回覆。是的,編譯可能不會給你帶來好處。 – manojlds 2011-04-16 03:57:07
我不確定該需求是否允許您解析文件行。如果文件中的一行可以獨立考慮,那麼我建議你將每個文件行(CPU vs內存??)而不是整個文件解析到內存中。 CPU週期/時間可能會增加,但我認爲使用的內存會減少。你可以試試看。 – 2011-04-16 04:30:14