LINQ Join的内存使用情况是多少?

时间:2012-11-14 03:41:52

标签: c# .net linq memory

  1. 如果两个IEnumerable(s)在内存中,加入它们的内存使用量是多少?假设选择所有列。左表的大小+右表的大小+连接表中的行数吗?

  2. 如果两个IEnumerable(s)是由文件流定义的,那么如果它们太大而无法放入内存中,Join会抛出内存不足吗?或者它会加载到内存不足并多次运行扫描(类似于数据库连接)?

1 个答案:

答案 0 :(得分:6)

Enumerable.JoinIterator处查看Reflector,似乎整个inner(第二个)序列被加载到内存中(进入Lookup),但是outer(然后流式传输序列(即全部加载到内存中)。

如果inner序列太大而无法容纳到内存中,似乎没有任何巧妙的事情发生。

Jon Skeets seems to agree on the first point

  

当涉及输入序列的消耗方式时,真正的Join运算符使用与Except和Intersect相同的行为:

     

...

     
      
  • 当第一次在结果序列上调用MoveNext时,它会立即消耗整个内部序列,并对其进行缓冲。

  •   
  • 外部序列是流式传输的 - 它一次只能读取一个元素。当结果序列开始产生外部第二个元素的结果时,它就忘记了第一个元素。

  •