3
  1. 2つのIEnumerableがメモリ内にある場合、それらを結合するためのメモリ使用量はどのくらいですか?すべての列を選択するとします。左のテーブルのサイズ+右のテーブルのサイズ+結合されたテーブルの行数ですか?

  2. 2つのIEnumerableがファイルストリーミングによって定義されている場合、それらが大きすぎてメモリに収まらない場合、Joinはメモリ不足の例外をスローしますか?または、メモリがなくなるまでロードし、スキャンを複数回実行しますか(データベース結合と同様)?

4

1 に答える 1

6

Reflector atを見ると、 (2番目の)シーケンスEnumerable.JoinIterator全体がメモリに(に)ロードされているように見えますが、(最初の)シーケンスはストリーミングされています(つまり、すべてがメモリにロードされているわけではありません)。innerLookupouter

innerシーケンスが大きすぎてメモリに収まらない場合は、賢いことは何も起こっていないようです。

Jon Skeetsは最初の点に同意しているようです

実際のJoin演算子は、入力シーケンスの消費方法に関して、ExceptおよびIntersectと同じ動作を使用します。

..。

  • 結果シーケンスでMoveNextが初めて呼び出されると、すぐに内部シーケンス全体が消費され、バッファリングされます。

  • 外側のシーケンスはストリーミングされます-一度に1つの要素のみが読み取られます。結果シーケンスが外部の2番目の要素から結果を生成し始めるまでに、最初の要素については忘れられています。

于 2012-11-14T08:22:43.663 に答える