繁体   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