0

次のコードを使用して、エンティティを Azure テーブルに挿入しようとしています。

    public void AddItems<T>(T[] entitis, string tableName) where T : TableServiceEntity
    {
        using (new TimeLogger(_logger, "save items in table " + tableName + ", count: " + entitis.Length + ", duration: {0}"))
        {
            tableName = GetSafeTableName(tableName);
            var items = RemoveDuplicates(entitis).ToArray();

            var tasks = new List<Task>();

            var context = _tableStorage.GetDataServiceContext();

            for (int i = 0; i < items.Length; i++)
            {
                context.AttachTo(tableName, items[i]);
                context.UpdateObject(items[i]);

                if (i % 10 == 0 || i == items.Length - 1)
                {
                    var context1 = context;

                    var task = Task.Factory.FromAsync<DataServiceResponse>(
                        context1.BeginSaveChangesWithRetries,
                        context1.EndSaveChangesWithRetries,
                        context1);

                    tasks.Add(task);

                    context = _tableStorage.GetDataServiceContext();
                }
            }

            Task.WaitAll(tasks.ToArray());
        }
    }

複数のパーティションで項目を渡すこのメソッドの呼び出し元。私のテストでは、異なるパーティションにある 450 個のアイテムの場合、約 7 秒から 8 秒の遅延があることがわかりました。私はここで何か間違ったことをしていると思います。どんなコメントでも大歓迎です。

4

1 に答える 1

0

何かが起こっているに違いない。5 秒以内に 2000 個のエンティティを挿入するテストを実行しましたが、まったく問題はありませんでした。

@smarx が既に述べたように、パフォーマンスに影響を与える設定可能なネットワーク パラメータがいくつかあります。それらすべてを含むブログ投稿があります/ありました。今は落ち込んでいるようですが、復活を期待しています。次の構成スニペットは、その記事の提案の一部を具体化しており、役立つ場合があります。

<system.net>
    <connectionManagement>
      <add address="*" maxconnection="45"/>
    </connectionManagement>
    <settings>
      <servicePointManager useNagleAlgorithm="true" expect100Continue="false" />
  </settings>
</system.net>

タスクを使用しているため、ThreadPool を使い果たしているかどうかも確認できます。Perfmon を使用して、テストの実行中にアクティブなスレッドの数を確認します。カウントが上昇し続けるか、非常に大きな数になる場合は、それが問題である可能性があります。その場合、Task の使用をスキップして、Begin/End 呼び出しの非同期結果を自分で追跡することができます。

于 2012-08-06T18:06:39.790 に答える