如果两个 IEnumerable(s) 在内存中,加入它们的内存使用量是多少?假设选择所有列。是左表的大小+右表的大小+连接表中的行数吗?
如果两个 IEnumerable(s) 是由文件流定义的,如果它们太大而无法放入内存,Join 会抛出内存异常吗?或者它会加载到内存接近不足并多次运行扫描(类似于数据库连接)?
问问题
559 次
1 回答
6
在 Reflector 中查看Enumerable.JoinIterator
,似乎整个inner
(第二个)序列被加载到内存中(到 aLookup
中),但是outer
(第一个)序列随后被流式传输(即不是全部加载到内存中)。
inner
如果序列太大而无法放入内存,则似乎没有什么聪明的事情发生。
当涉及到如何使用输入序列时,真正的 Join 运算符使用与 except 和 Intersect 相同的行为:
...
当第一次在结果序列上调用 MoveNext 时,它会立即消耗整个内部序列,并对其进行缓冲。
外部序列是流式传输的——一次只读取一个元素。当结果序列开始从外部的第二个元素产生结果时,它已经忘记了第一个元素。
于 2012-11-14T08:22:43.663 回答