尋求一些建議,最佳實踐等..C#內存溢出,內存映射文件或臨時數據庫
技術:C#.NET4.0,的WinForms,32位
我尋求如何我一些建議可以最好地處理我的C#Winforms應用程序中的大量數據處理,這些應用程序經歷了高內存使用(工作集)和偶爾的OutOfMemory異常。
問題是,當「購物籃」打開時,我們會執行大量的「內存中」數據處理。 簡單來說,當「購物籃」加載時,我們執行以下計算;
對於「購物籃」的每個項目進行檢索歷史價格將所有的方式回到項目首次出現在股票的日期(可能是兩個月的時間,兩年二十年的數據)。歷史價格數據通過互聯網從文本文件中檢索,價格插件支持的任何格式。
對於每件商品,自首次出現在庫存中以來的每一天計算各種指標,爲購物籃中的每件商品建立歷史配置文件。
其結果是,我們可以執行數百,千和/或數百萬計算,具體取決於「購物籃」中的物品數量。如果籃子包含太多項目,我們會冒着發生「OutOfMemory」異常的風險。
一些注意事項;
需要爲「購物籃」中的每個商品計算這些數據,數據一直保存到「購物籃」關閉。
儘管我們在後臺線程中執行步驟1和2,但速度非常重要,因爲「購物籃」中的項目數量可以極大地影響整體計算速度。
當「購物籃」關閉時,內存被.NET垃圾回收器搶救。我們對我們的應用程序進行了簡要介紹,並確保在關閉購物籃時所有參考資料都能正確處理和關閉。
完成所有計算後,結果數據存儲在IDictionary中。 「CalculatedData是一類對象,其屬性是通過上述方法計算出各個指標
一些想法,我也想過。
顯然,我的主要關注點是降低的內存量是使用但只能減少所使用的存儲器的量的計算,如果我
1)降低度量的數目來計算的每一天或
2)減少用於計算的天數。
如果我們希望實現我們的業務需求,這兩個選項都不可行。
內存映射文件
一個想法是使用內存映射將存儲數據字典文件。這是否可行/可行?我們如何才能實現這一目標?使用臨時數據庫
這個想法是使用一個單獨的(不是內存中的)數據庫,它可以爲應用程序的生命週期創建。隨着「購物籃」的開放,我們可以將計算的數據保存到數據庫中以便重複使用,從而減輕重新計算相同「購物籃」的要求。
我們應該考慮其他的替代方案嗎?在計算大數據並在RAM之外進行計算時,最佳做法是什麼?
任何意見是讚賞....
'OutOfMemoryException'真的[ 「出的地址空間」](http://blogs.msdn.com/b/ericlippert/archive/2009/06/08/out-of -memory-does-not-refer-to-physical-memory.aspx) - 你有沒有考慮遷移到64位? – 2012-02-26 04:40:01