3

我有大约 100,000 个句子List<string>

我试图按单词拆分这些句子中的每一个,并将所有内容添加到List<List<string>>每个List包含一个句子和另一个包含另一个List单词的位置。我这样做是因为我必须对每个单词做不同的工作。仅List<string>句子与List<List<string>>记忆中单词的大小差异是多少?

其中一个最终将存储在内存中,因此我正在寻找拆分每个句子而不是仅仅一个句子对内存的影响string

4

3 回答 3

4

因此,首先我们将比较单个字符串或两个字符串之间的内存差异,如果将它们连接在一起,将产生第一个:

string first = "ab";

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

与一起first使用多少内存?好吧,它们需要引用的实际字符是相同的,但是每个字符串对象都有很小的开销(32 位系统上为 14 个字节,64 位系统上为 26 个字节)。secondthird

因此,对于您分解为List<string>代表较小字符串的每个字符串,都有一个14 * (wordsPerSentance - 1)字节开销。

然后是列表本身的开销。列表将消耗一个字的内存(在 32 位系统上为 32 位,在 64 位系统上为 64 位,等等)添加到列表中的每个项目加上List<string>自身的开销(在 32 位系统上为 24 字节) )。

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

于 2013-04-25T19:50:27.203 回答
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>>. 如果我们假设每个句子 10 个单词,那么每个句子的列表将需要大约 80 个字节作为后备数组,加上每个字符串 26 个字节(总共大约 260 个字节),再加上字符串数据本身(8 个字符,或总共 160 个字节)。因此,每个句子都会花费您(再次,整数)80 + 260 + 160 或 500 个字节。乘以 100,000 个句子,即 50 MB。

所以,非常粗略的数字,将你的句子分成一个List<List<string>>将占用 55 或 60 兆字节。

于 2013-04-25T19:58:01.820 回答
1

不幸的是,这不是一个可以很容易回答的问题——它取决于特定的字符串,以及您愿意为了优化而采用的长度。

例如,看一下String.Intern()方法。如果您对所有单词进行实习,则单词集合可能比句子集合需要更少的内存。这将取决于内容。不过,实习还有其他含义,所以这可能不是最好的主意。同样,这将取决于情况的具体情况——检查我链接的文档页面的“性能注意事项”部分。

我认为最好的办法是在操作前后使用GC.GetTotalMemory(true)来大致了解实际使用了多少内存。

于 2013-04-25T19:57:39.990 回答