我在List<string>
中约有100,000个句子。
我正在尝试按字词拆分这些句子并将所有内容添加到List<List<string>>
中,其中每个List
包含一个句子,其中包含另外List
个单词。我这样做是因为我必须对每个单词做不同的工作。只有List<string>
句子与内存中单词List<List<string>>
的大小差异是多少?
其中一个将最终存储在内存中,所以我正在寻找分裂每个句子与仅string
答案 0 :(得分:4)
所以,首先我们将比较单个字符串或两个字符串之间的内存差异,如果连接在一起,将导致第一个字符串:
string first = "ab";
string second = "a";
string third = "b";
与first
和second
相比,third
使用了多少内存?那么,他们需要引用的实际字符是相同的,但是every single string object has a small overhead(32位系统上14个字节,64位系统上26个字节)。
因此,对于分解为表示较小字符串的List<string>
的每个字符串,都会产生14 * (wordsPerSentance - 1)
字节开销。
然后是列表本身的开销。对于添加到列表中的每个项目加上List<string>
本身的开销(24字节),该列表将消耗一个字的内存(32位系统上32位,64位系统上64位等)。在32位系统上。)
因此,您需要添加(在32位系统上)(24 + (8 * averageWordsPerSentance)) * numberOfSentances
字节的内存。
答案 1 :(得分:4)
我们将从您的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兆字节。
答案 2 :(得分:1)
不幸的是,这不是一个可以很容易回答的问题 - 它取决于特定的字符串,以及您为了优化而愿意花多长时间。
例如,请查看String.Intern()方法。如果你实习所有单词,那么单词集合可能需要 less 内存而不是句子集合。这取决于内容。不过,实习还有其他一些含义,所以这可能不是最好的主意。同样,这将取决于具体情况 - 查看我链接的文档页面的“性能注意事项”部分。
我认为最好的办法是在操作之前和之后使用GC.GetTotalMemory(true)来大致了解实际使用的内存量。