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

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

4

1 回答 1

6

在 Reflector 中查看Enumerable.JoinIterator,似乎整个inner(第二个)序列被加载到内存中(到 aLookup中),但是outer(第一个)序列随后被流式传输(即不是全部加载到内存中)。

inner如果序列太大而无法放入内存,则似乎没有什么聪明的事情发生。

Jon Skeets 似乎同意第一点

当涉及到如何使用输入序列时,真正的 Join 运算符使用与 except 和 Intersect 相同的行为:

...

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

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

于 2012-11-14T08:22:43.663 回答