6

別のシステムから多数の Sitecore アイテムをループで作成する必要がある Sitecore アプリケーションがあります。以下は私のテスト目的のループです。

using (new Sitecore.SecurityModel.SecurityDisabler())
{
    for (int i = 0; i < 20000; i++)
    {
        Item newItem = MyTemplateItem.CreateItemFrom(DateTime.Now.Ticks.ToString(), myParentItem);

        newItem.Editing.BeginEdit();
        newItem.Fields["Title"].Value = Guid.NewGuid().ToString();
        newItem.Editing.EndEdit();
    }
}

このループが実行されているときにタスク マネージャーを見ていると、プロセスのメモリ使用量が時間とともに増加しています。

SitecoreItemクラスにはIDisposableインターフェイスが実装されていないため、作成したアイテムの Finalizer を呼び出すことができません。

このメモリリークを回避するにはどうすればよいですか?

PS: Windows アプリケーションを使用してこの操作を実行し、Sitecore がキャッシュの更新とインデックスの構築を行う IIS プロセスのメモリ リークを回避しています。

4

3 に答える 3

3

アイテムの作成中にデータベース キャッシュを一時的に無効にすることができます。

using (new Sitecore.Data.DatabaseCacheDisabler())

次を使用して、作成中にインデックス作成を無効にすることができます。

Sitecore.Configuration.Settings.Indexing.Enabled = false;

これら 2 つのことを追加してみて、それが役立つかどうかを確認してください。

更新: たぶんこれでうまくいくでしょう。EndEdit() の後にこれをループ内に追加します。

newItem = null;

if (i % 100 == 0)
{
  GC.Collect();
  GC.WaitForPendingFinalizers();
}

100 個のアイテムが追加されるたびに、ガベージ コレクターが未使用のメモリを再利用しようとします。

これが機能する場合、実際にGCを自分で呼び出す必要はありません.GCはある時点で自動的に呼び出されます.いつになるかはわかりません.

于 2013-05-17T07:33:26.583 に答える
0

キャッシュの制限を高い値 (つまり、高すぎる値) に設定して実行している場合、報告されている症状が発生するのは当然のことと思われます。スクリプトの実行中にページ /sitecore/admin/cache.aspx を見ると、その場合に表示されます。エントリーmaster[items]をイメージしてどんどんmaster[data]登っていきます…

この場合、キャッシュ制限を低く設定するだけ、必要に応じてキャッシュを空にすることができます。

また、プログラマティック アイテムの作成を大幅にスピードアップしたい場合は、

using (new BulkUpdateContext()) { code.. }

BulkUpdateContext() がキャッシュへのアイテムの追加もスキップする可能性があります。これが事実であるかどうかは確認していませんが、そうであれば、メモリの問題を「修正」する可能性があります。

(このSOの回答も参照してください)。いくつかのパイプラインが無効になることに注意してください。

于 2013-05-28T13:58:16.350 に答える