【问题标题】:What's the memory usage of LINQ Join?LINQ Join 的内存使用量是多少?
【发布时间】:2012-11-02 14:05:12
【问题描述】:
  1. 如果两个 IEnumerable(s) 在内存中,加入它们的内存使用量是多少?假设选择所有列。是左表大小+右表大小+连接表行数吗?

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

【问题讨论】:

  • 为什么不试试看呢?它可能“取决于”,就像世界上大多数事情一样。这当然取决于所使用的 LINQ 提供程序。
  • 我很好奇你为什么这么问。为什么连接的内存使用很重要?
  • 当你说“加入”时,你的意思是“联合”(A 的所有行后跟 B 的所有行,如 JoinIterator 方法)还是指 linq/database 样式“Inner/Outer Join”(根据关键字段将 A 和 B 的行组合成一行)?
  • 我的意思是 Enumerable.Join(),例如内连接

标签: c# .net linq memory


【解决方案1】:

在反射器中查看Enumerable.JoinIterator,似乎整个inner(第二个)序列被加载到内存中(进入Lookup),但是outer(第一)序列随后被流式传输(即没有全部加载到内存中)。

如果inner 序列太大而无法放入内存,似乎没有什么聪明之处。

Jon Skeets seems to agree on the first point:

真正的 Join 运算符在处理输入序列的使用方式时使用与 except 和 Intersect 相同的行为:

...

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

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

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    相关资源
    最近更新 更多