2011-06-23 15 views
2

Seqモジュールにいくつかの集計関数を追加しようとしています。私はここに記載されている機能のいくつかの実装を見ていた:。そこにある免責事項のSeqモジュールの集計関数

https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/seq.fs

ワン「この関数は、とすぐにそのシーケンスが繰り返されるよう全体の初期シーケンスを消化するシーケンスを返します。この関数は大規模または無限配列では使用しないでください。 これは、GroupByなどの多くの関数に当てはまります。

  • 最初の質問:大規模なシーケンスを効率的に処理できる集計関数を作成する方法はありますか?私は "大"が主観的であることを知っています。私はそのような機能を書くための一般的なパターンを探しています。

  • 2番目の質問:辞書(集計関数内で定義されている)などのコレクションが効率的にガベージコレクションされるようにするにはどうすればよいですか?辞書が範囲外になったときに辞書を収集するべきだと理解していますが、それを明示的に示す方法はありますか?辞書がスコープ内に残っているとすれば、そのどちらかで.Clear()を呼び出すことはできません。あなたの最初の質問に答えるために

+1

'Seq.fold'の観点からは実装できない集約タイプはありますか? – ildjarn

+0

SumBy関数のようなものはどうですか? Seq のようなもので、最初の列でグループ化し、2番目の列で集計したいとします。Seq.SumにSeq.GroupByとパイプラインを実行できますが、パフォーマンスは劣ります.. – Bala

+0

http ://fssnip.net/5U? – ildjarn

答えて

5

は - この場合、入力の問題点は、シーケンス全体がfoldまたはgroupByのような関数が結果を与えることができます前に処理しなければならないことです。 - 結果はまた、シーケンスであり、あなたはそれを消費する(そして多くを得るlaziliyできるだけfoldのような値を集計が、すべての要素を追加した後に現在の状態を得Seq.scanよう

  • 使用機能:あなたができることがいくつかあります。より正確な結果など)。

  • seq<'a>を返す関数を書くときは、シーケンスの次の要素を取得するだけで、入力の要素の予測可能な数(入力シーケンス全体ではなく)が消費されるように設計する必要があります。これは不可能である。 groupByの場合、同じグループの隣接要素だけをグループ化するグループ化のような構文を書くことができます。

2番目の質問に答えるには、一般的にガベージコレクタをあまり心配するべきではありません。関数の最後にガベージコレクションを強制することは、GCをうまく動作させることだけに頼るよりも、おそらく多くの害を引き起こします。