如何在C#中存儲大量數據而不引發OutOfMemoryException?

最近在.Net上寫一個數據分析的程序發現,即使內存充裕的情況下,單個對象佔用內存過大也會引發System.OutOfMemoryException異常,而實際有處理近上億條數據的需求,如何在盡量不使用Native、不使用IO做緩存的前提下直接在內存中處理這些數據?處理過程中需要用到鍵值對集合,所以盡量不要拆分到不同對象中處理,運行機器有32GB內存。十分感謝!


單個數組(或列表等內部用了數組的東西)最大不能超過2G(指所有的指針加起來),不管你內存多大都一樣。你只需要簡單地做一下partition就可以了。如果你處理數據很麻煩的話,SQLServer 2014支持內存資料庫,可以配合linq和entity framework盡情使用。


& Element

On 64-bit platforms, enables arrays that are greater than 2 gigabytes (GB) in total size.

Remarks

Using this element in your application configuration file enables arrays that are larger than 2 GB in size, but does not change other limits on object size or array size:

  • The maximum number of elements in an array is UInt32.MaxValue.

  • The maximum index in any single dimension is 2,147,483,591 (0x7FFFFFC7) for byte arrays and arrays of single-byte structures, and 2,146,435,071 (0X7FEFFFFF) for other types.

  • The maximum size for strings and other non-array objects is unchanged.


如果程序是32位的 只能用2g的內存,試著改成64位。如果數組的話因為索引是int型的,能存儲的數據數目肯定不能比Int32.MaxValue 還多吧!而且數組要開闢一塊連續的空間 如果內存中連續空間不夠也可能導致內存溢出,記得.net中可以預先開闢指定大小的內存供你使用 具體代碼忘了


推薦閱讀:

為什麼聽說過 JVM 調優,卻沒聽說過 CLR 調優?
WebApi和MVC有什麼區別?
ASP.NET開源以後會有更多的網站選擇這個平台么?
ADO.NET的SqlParameter(String,?Object)的構造函數第二個參數不能為0?
處理XMLHttpRequest時如何判斷是否是自己網站發出的?

TAG:NET | VisualC# | C# | C#編程 | Net開發 |