2010-07-19 37 views
0

我擁有下一個實例化大約4000萬次的類,其所有實例佔用全部進程內存(大於15GB)的80%。.NET。最大限度地減少內存使用/優化類設計

class MyClass 
{ 
    String Field1 
    String Field2 
    String Field3 
    int Field4 
    int Field5 
    float Field6 
    SomeEnum Field7 
    Boolean Field8 
    Boolean Field9 
    Boolean Field10 
    Byte Field11 
    Byte Field12 
} 

我想以某種方式來優化這個類,但不知道我能在這種情況下做什麼。我想將布爾型字段組合成單個字節或自定義字段對齊,但不確定它是否更糟,以及它是否不會破壞某些內容。還試圖將其改爲結構,但在現有代碼中出現性能問題而沒有顯着改進。

那麼,在沒有嚴重的性能下降的情況下,如何減少內存使用量呢?

此代碼將主要在x64服務器上運行,x32僅在開發中運行。

編輯:

這是服務,咋辦很快返回取決於所有這些數據的結果。這裏的速度非常快,約爲20ms-150ms。所以所有的數據都被哈希和排序,並且該類中的每個字段幾乎用於對服務的每個請求。可能這裏的設計不好,但設計在這裏不是問題,我現在無法從頭開始重新設計它。

+3

你真的需要在內存上放置4000萬個物品嗎?爲什麼不保留數據庫並使用sql來處理它們? – Giorgi 2010-07-19 14:31:03

+0

它已經在數據庫之後:) – Kamarey 2010-07-19 14:33:27

+1

你在用數據庫中無法做到的4000萬條記錄做什麼? – 2010-07-19 14:35:23

回答

1

簡單的答案:根本不要使用課堂。

實例約40萬次 及其所有情況下采取一切進程的內存(超過 15GB)的約80% 。

用於什麼?聽起來像你需要一個數據庫。任何特定的原因?

5

當然你可以把所有的布爾變成一個字段。將枚舉和字節值組合到一個字段中可以節省內存,因爲字段通常是對齊的,因此佔用更多空間。在.NET中也有控制成員對齊的屬性。

但最後你有一個設計問題。最好嘗試重新設計你的應用程序。所有的數據值是否真的需要同時進入內存?你可以把不需要的部分放在硬盤上,只有在真正需要時才能檢索它?

告訴我們更多關於應用程序的功能,以便我們爲您創建一些想法。

1

感覺像一個奇怪的設計,如果我沒有錯算,15GB/4000萬超過400.所以假設只是這個類佔據了大部分空間,這似乎表明每個實例使用數百字節。我懷疑通過將3個布爾值更改爲一個字節來節省幾個字節會好得多。

我假設它是佔用大部分空間的字符串,也許你可以將字符串留在數據庫中,只在你的類中存儲一個ID,然後你可以根據需要查看它們。

1

由於字符串最有可能保存最大的內存量,所以您可以嘗試字符串實習。

相關問題