= 100 sum = (0...(all/limit)).reduce(0) do |sum, i| part = getUsers(i * limit, limit) # 100件分はメモリに乗る . .select { |u| u.gender == "male" } .map { |u| u.age } .sum sum + part # メモリ上には常に単一の演算結果のみが残る . end sum / all end # データベースの `Users` テーブルへのアクセスを模倣した関数 . def getUsers(offset, limit) # name, age, height, weight, gender. (0...limit).map { |_| {name: "Taro", age: 28, h: 165, w: 58, gender: "male"} } end 2⃣ リークではないが... 演算の結果だけを返す様にしたい。これで切れた参照はちゃんと GC されます。 時間 メモリ(件数) 100件 常に一定で推移