我有大约 100,000 个句子List<string>
。
我试图按单词拆分这些句子中的每一个,并将所有内容添加到List<List<string>>
每个List
包含一个句子和另一个包含另一个List
单词的位置。我这样做是因为我必须对每个单词做不同的工作。仅List<string>
句子与List<List<string>>
记忆中单词的大小差异是多少?
其中一个最终将存储在内存中,因此我正在寻找拆分每个句子而不是仅仅一个句子对内存的影响string
我有大约 100,000 个句子List<string>
。
我试图按单词拆分这些句子中的每一个,并将所有内容添加到List<List<string>>
每个List
包含一个句子和另一个包含另一个List
单词的位置。我这样做是因为我必须对每个单词做不同的工作。仅List<string>
句子与List<List<string>>
记忆中单词的大小差异是多少?
其中一个最终将存储在内存中,因此我正在寻找拆分每个句子而不是仅仅一个句子对内存的影响string
因此,首先我们将比较单个字符串或两个字符串之间的内存差异,如果将它们连接在一起,将产生第一个:
string first = "ab";
string second = "a";
string third = "b";
与一起first
使用多少内存?好吧,它们需要引用的实际字符是相同的,但是每个字符串对象都有很小的开销(32 位系统上为 14 个字节,64 位系统上为 26 个字节)。second
third
因此,对于您分解为List<string>
代表较小字符串的每个字符串,都有一个14 * (wordsPerSentance - 1)
字节开销。
然后是列表本身的开销。列表将消耗一个字的内存(在 32 位系统上为 32 位,在 64 位系统上为 64 位,等等)添加到列表中的每个项目加上List<string>
自身的开销(在 32 位系统上为 24 字节) )。
因此,您需要添加(在 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>>
. 如果我们假设每个句子 10 个单词,那么每个句子的列表将需要大约 80 个字节作为后备数组,加上每个字符串 26 个字节(总共大约 260 个字节),再加上字符串数据本身(8 个字符,或总共 160 个字节)。因此,每个句子都会花费您(再次,整数)80 + 260 + 160 或 500 个字节。乘以 100,000 个句子,即 50 MB。
所以,非常粗略的数字,将你的句子分成一个List<List<string>>
将占用 55 或 60 兆字节。
不幸的是,这不是一个可以很容易回答的问题——它取决于特定的字符串,以及您愿意为了优化而采用的长度。
例如,看一下String.Intern()方法。如果您对所有单词进行实习,则单词集合可能比句子集合需要更少的内存。这将取决于内容。不过,实习还有其他含义,所以这可能不是最好的主意。同样,这将取决于情况的具体情况——检查我链接的文档页面的“性能注意事项”部分。
我认为最好的办法是在操作前后使用GC.GetTotalMemory(true)来大致了解实际使用了多少内存。