簡體   English   中英

內存中不同對象的大小

[英]Size of different objects in memory

我在List<string>喜歡大約100,000個句子。

我試圖用單詞拆分這些句子並將所有內容添加到List<List<string>> ,其中每個List包含一個句子,其中包含另一個單詞List 我這樣做是因為我必須對每個單詞做不同的工作。 只有List<string>的句子與內存中單詞的List<List<string>>的大小差異是什么?

其中一個將最終存儲在內存中,所以我正在尋找分裂每個句子與僅僅string的內存影響

所以,首先我們將比較單個字符串或兩個字符串之間的內存差異,如果連接在一起,將導致第一個字符串:

string first = "ab";

string second = "a";
string third = "b";

secondthird相比, first使用多少內存? 好吧,他們需要引用的實際字符是相同的,但是每個字符串對象的開銷都很小 (32位系統上為14字節,64位系統上為26字節)。

因此,對於分解為表示較小字符串的List<string>每個字符串,存在14 * (wordsPerSentance - 1)字節開銷。

然后是列表本身的開銷。 對於添加到列表中的每個項目以及List<string>本身的開銷(其為24字節),該列表將消耗一個字的內存(32位系統上為32位,64位系統上為64位等)。 32位系統)。

因此,您需要添加(在32位系統上) (24 + (8 * averageWordsPerSentance)) * numberOfSentances字節的內存。

我們將從您的List<string> 我將假設64位運行時。 32位運行時的數字略小。

List本身需要大約32個字節(分配開銷,加上內部變量),以及字符串的后備數組。 數組開銷是50個字節,每個字符串需要8個字節用於引用。 因此,如果您有100,000個句子,那么陣列至少需要800,000個字節。

字符串本身需要每個字節26個字節,每個字符加兩個字節。 因此,如果您的平均句子是80個字符,則每個字符串需要186個字節。 乘以100K字符串,即大約18.5兆字節。 總而言之,您的句子列表大約需要20 MB(整數)。

如果將句子拆分為單詞,則現在有100,000個List<string>實例。 對於List<List<string>>大約只有5兆字節。 如果我們假設每個句子10個單詞,則每個句子的列表將需要大約80個字節用於后備陣列,加上每個字符串26個字節(總共大約260個字節),加上字符串數據本身(8個字符,或總共160個字節)。 所以每個句子花費你(再次,圓數)80 + 260 + 160,或500字節。 乘以100,000個句子,即50 MB。

因此,非常粗略的數字,將您的句子分成List<List<string>>將占用55或60兆字節。

不幸的是,這不是一個可以很容易回答的問題 - 它取決於特定的字符串,以及您為了優化而願意花多長時間。

例如,看看String.Intern()方法。 如果你實習所有單詞,那么單詞集合可能比句子集合需要更少的內存。 這取決於內容。 不過,實習還有其他一些含義,所以這可能不是最好的主意。 同樣,它將取決於具體情況 - 檢查我鏈接的文檔頁面的“性能注意事項”部分。

我認為最好的辦法是在操作之前和之后使用GC.GetTotalMemory(true)來大致了解實際使用的內存量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM