1 億を超えるオブジェクトを含むバイナリ ファイルがあり、オブジェクトを使用してファイルを読み取り、BinaryReader
( ) オブジェクトを返しYield
ます (ファイル リーダーとIEnumerable
実装はこちら: IEnumerable のパフォーマンス比較とソース内の各アイテムのイベントの発生? )
オブジェクトのプロパティの 1 つは、オブジェクトのランク ( などA5
) を示します。top n
プロパティに基づいてソートされたオブジェクトを取得したいとします。
関数のコードを見ましたOrderBy
。QuickSort アルゴリズムを使用しています。と関数でIEnumerable
結果をソートしようとしましたが、関数はクイックソートを実装するために合計オブジェクト数のサイズの配列を作成するため、例外が発生しました。OrderBy
Take(n)
OutOfMemory
OrderBy
実際、必要なメモリの合計はnなので、大きな配列を作成する必要はありません。たとえば、Take(1000) を取得すると、1000 個のオブジェクトのみが返され、オブジェクト全体の合計数には依存しません。
OrderBy
関数で関数の結果を取得するにはどうすればよいTake
ですか? 言い換えれば、エンドユーザーによって定義された容量を持つ制限付きまたはブロックされたソート済みリストが必要です。