1

この質問は私の以前の質問に関連しています

それが私の現在のコードです

 IEnumerable<Shape> Get()
 {
     while(//get implementation
         yield return new Shape(//...
 }

 void Insert()
 {
       var actual = Get();
       using (var db = new DataClassesDataContext())
       {
           db.Shapes.InsertAllOnSubmit(actual);
           db.SubmitChanges();
       }
 }

IEnumerable が大きすぎるため、メモリ オーバーフローが発生しています。どうすれば防ぐことができますか?

4

4 に答える 4

3

1 つのオプションは、複数のバッチに分割することです。オブジェクトの一時バッファを作成し、Shapeそれを埋めるか、列挙子から使い果たすまで繰り返し、InsertBatchOnSubmit.

于 2009-06-23T18:57:37.880 に答える
3

InsertAllOnSubmitではなくInsertOnSubmitを使用してみてください。そして、Erich が言ったように、適切な間隔でコミットします。

または、たとえば 5 つのバッチで実行する場合は、IEnumerable の IEnumerable を取得するための Handcraftsmanまたはdtbのソリューションを試してください。たとえば、dtb のチャンクを使用する場合:

   var actual = Get();
   using (var db = new DataClassesDataContext())
   {
       foreach(var batch in actual.Chunk(5))
       {
         db.Shapes.InsertAllOnSubmit(batch);
         db.SubmitChanges();
       }
   }
于 2009-06-23T18:58:44.320 に答える
2

次の拡張メソッドを使用して、入力を適切なサイズのサブセットに分割します

public static class IEnumerableExtensions
{
    public static IEnumerable<List<T>> InSetsOf<T>(this IEnumerable<T> source, int max)
    {
        List<T> toReturn = new List<T>();
        foreach(var item in source)
        {
            toReturn.Add(item);
            if (toReturn.Count == max)
            {
                yield return toReturn;
                toReturn = new List<T>();
            }
        }
        if (toReturn.Any())
        {
            yield return toReturn;
        }
    }
}

次に、サブセットを永続化します

void Insert()
{
    var actual = Get();
    using (var db = new DataClassesDataContext())
    {
        foreach (var set in actual.InSetsOf(5))
        {
            db.Shapes.InsertAllOnSubmit(set);
            db.SubmitChanges();
        }
    }
}

InsertOnSubmit() と InsertAllOnSubmit() に関するこの MSDN の記事も役立つ場合があります。

于 2009-06-23T20:37:22.547 に答える
1

IEnumerable からアイテムのバッチを取得する適切な方法については、次を参照してください。

C#: 文字列配列を N インスタンス N 項目の長さに分割する最もクリーンな方法

更新: 配列で動作します。しばらくして、他の誰も何かを提供していない場合は、それを書きます...

于 2009-06-23T19:07:05.333 に答える