0

IEnumerable何らかの処理を行いたいオブジェクトがあります。ただし、コレクションが大きくなりすぎるとOutOfMemoryException、列挙時に、たとえば の呼び出しで がスローされますCount()

明らかな解決策は、コレクションを複数の部分に分割して、各部分が大きくなりすぎないようにすることです。しかし、各パーツのオブジェクトの理想的な量はわかりません。また、各オブジェクトの潜在的なサイズがわからないため、「マジック ナンバー」を避けたいと考えています。そもそもそれを複数の部分に分割することが良い解決策であるかどうかさえわかりません。何か案は?

編集:

私のコードには、この関数があります。サイズを追加するラッパー オブジェクトのコレクションに をSelect投影することに注意してください。MyDataこのコレクションが列挙されると、例外が発生します (messages.Select(m => new CloudQueueMessage(m.ToBinary())).ToList()すぐに例外を取得することもできます)。

    public static void AddMessages(IEnumerable<MyData> messages)
    {
        DoStuff(messages.Select(m => new CloudQueueMessage(m.ToBinary())));
    }
4

3 に答える 3

3

Enumerable.Count()コレクションではなくクエリである場合は、シーケンスを列挙してカウントを取得します(その後、Countプロパティを使用しています)。ただし、シーケンスを列挙したとしても、OutOfMemoryException何か新しいものを作成しないため、スローすべきではありません。

で実行される「実体化されていない」クエリを使用していると思いますCount()ToList()またはを使用する場合にも例外が発生しますToArray()。そのため、クエリを表示する必要があり、メモリ消費に関して最適化を試みることができます。

于 2013-04-17T10:24:25.330 に答える