如何在大字符串中運行大量RegExes(查找匹配項)而不引起LOH碎片?RegEx,StringBuilder和大對象堆碎片
它是.NET Framework 4.0,因此我使用StringBuilder
所以它不在LOH中,但只要我需要運行RegEx,我必須調用StringBuilder.ToString()
這意味着它將在LOH中。
有沒有解決這個問題的方法?實際上不可能有一個長期運行的應用程序來處理像這樣的大字符串和RegEx。
構想來解決這個問題:雖然在思考這個問題
,我想我找到了一個骯髒的解決方案。
在給定的時間,我只有5個字符串,這5個字符串(大於85KB)將被傳遞給RegEx.Match
。
由於出現碎片,因爲新對象將不適合於蕙空的空間,這應該解決的問題:
PadRight
所有字符串到最大。被接受的大小,讓我們說1024KB(我可能需要StringBuider
做到這一點)- 這樣所有新的字符串作爲以前的字符串已經超出了範圍將適合於已經清空內存
- 不會有任何碎片,因爲對象大小始終是相同的,因此我將只在給定時間分配1024 * 5,並且這些空間在LOH中將在這些字符串之間共享。
我想這個設計的最大問題如果其他大對象在LOH中分配這個位置會導致應用程序分配大量的1024 KB字符串,可能會導致更多的碎片。 fixed
聲明可能會有幫助,但是我怎樣才能發送一個固定的字符串到RegEx而不實際創建一個不位於固定內存地址的新字符串?
關於這個理論的任何想法? (遺憾的是我不能輕易地重現該問題,我通常試圖用一個內存分析器觀察其變化,不知道什麼樣的獨立的測試情況我可以爲此寫)
你確定大對象堆變得零散嗎?我用很大的(幾百千字節)字符串做了很多工作,而且我從未遇到過LOH碎片問題。 –
是的,我確定。應用程序需要耗費內存並長時間運行以查看其實際影響。如果你真的做內存分析,你可能會看到它影響你,但沒有足夠多的崩潰你的應用程序。 –
是的,這很容易。一百塊錢可以買一個64位操作系統。沒有一種編程工作可以與之相匹配。 –