2つのIEnumerableがメモリ内にある場合、それらを結合するためのメモリ使用量はどのくらいですか?すべての列を選択するとします。左のテーブルのサイズ+右のテーブルのサイズ+結合されたテーブルの行数ですか?
2つのIEnumerableがファイルストリーミングによって定義されている場合、それらが大きすぎてメモリに収まらない場合、Joinはメモリ不足の例外をスローしますか?または、メモリがなくなるまでロードし、スキャンを複数回実行しますか(データベース結合と同様)?
質問する
559 次
1 に答える
6
Reflector atを見ると、 (2番目の)シーケンスEnumerable.JoinIterator
全体がメモリに(に)ロードされているように見えますが、(最初の)シーケンスはストリーミングされています(つまり、すべてがメモリにロードされているわけではありません)。inner
Lookup
outer
inner
シーケンスが大きすぎてメモリに収まらない場合は、賢いことは何も起こっていないようです。
実際のJoin演算子は、入力シーケンスの消費方法に関して、ExceptおよびIntersectと同じ動作を使用します。
..。
結果シーケンスでMoveNextが初めて呼び出されると、すぐに内部シーケンス全体が消費され、バッファリングされます。
外側のシーケンスはストリーミングされます-一度に1つの要素のみが読み取られます。結果シーケンスが外部の2番目の要素から結果を生成し始めるまでに、最初の要素については忘れられています。
于 2012-11-14T08:22:43.663 に答える