多分処理中にG2のGCが入った時点でメモリ管理は失敗、大失敗といえるんだろう。そんなのは処理が終わった後の空き時間でやればいいんだ。

 小さいオブジェクトを作ってすぐ捨ててG0,G1にとどめる。大きいマネージオブジェクトは出来てしまった時点で失敗。大きいオブジェクトはデータベースとかファイルとかのアンマネージ世界に押し付けなきゃいけない。ただその大きいオブジェクトが処理の終わりまで残り続けるもので、作っては捨てとかされず、メモリも圧迫しないなら持っていてもいい。

 大きいマネージオブジェクトを使うにはMemoryStreamにBinaryFormatterで一つずつ書き込み、IEnumerableで一つずつ読んでいく、いらなくなったらPosition=0、ということになるだろうか。MemoryStreamはG2に居続けてもらう。まあ普通にLINQ to SQLの方がいいか。今はEntity Frameworkとかいうのを使わなきゃいけないんだっけ。