5

64ビットサーバーでSDLTridion2009 SP1を使用しており、システム内のすべてのマルチメディアコンポーネント(190K以上)の大規模なXMLを公開しようとしています。folder.GetListItems(filter)フィルタをに設定したメソッドを使用していますRecursive="true"

テンプレートは数秒間実行された後、メモリ不足エラーで爆発します。

<?xml version="1.0"?>
<tcm:Error xmlns:tcm="http://www.tridion.com/ContentManager/5.0" ErrorCode="7" Category="7" Source="Kernel" Severity="1"><tcm:Line ErrorCode="7" Cause="true"><![CDATA[Out of memory]]></tcm:Line><tcm:Details><tcm:CallStack><tcm:Location>FolderBLST.GetListData</tcm:Location></tcm:CallStack></tcm:Details></tcm:Error>
   at Tridion.ContentManager.Interop.TDSBL._IBLOrganizationalItemST.GetListData(UserContext userContext, String URI, EnumListKind listKind, ListColumnFilter columnFilter, String rowFilter)
   at Tridion.ContentManager.ContentManagement.OrganizationalItem.GetListItems(Filter filter)
   at myNS.myTbb.Transform(Engine engine, Package package)
   at Tridion.ContentManager.Templating.Assembly.AssemblyMediator.Transform(Engine engine, Template template, Package package)
   at Tridion.ContentManager.Templating.Assembly.CSharpSourceCodeMediator.RunTemplate(Engine engine, Package package, String templateUri, String className)
   at Tridion.Templating.CSharpTemplate.CSharpSourceTemplate.Transform(Engine __engine, Package __package)
   at Tridion.ContentManager.Templating.Assembly.CSharpSourceCodeMediator.Transform(Engine engine, Template template, Package package)
   at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package)
   at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template)
   at Tridion.ContentManager.Templating.Compound.CompoundTemplateMediator.Transform(Engine engine, Template templateToTransform, Package package)
   at Tridion.ContentManager.Templating.Engine.ExecuteTemplate(Template template, Package package)
   at Tridion.ContentManager.Templating.Engine.InvokeTemplate(Package package, TemplateInvocation templateInvocation, Template template)
   at Tridion.ContentManager.Templating.Engine.TransformPackage(Template template, Package package)
   at Tridion.ContentManager.Templating.Engine.TransformItem(Template template, IdentifiableObject itemToRender)
   at Tridion.ContentManager.Templating.Debugging.DebuggingEngine.Run()
   at Tridion.ContentManager.Templating.Debugging.DebugSession.Run()

スタックトレースからは、CMサーバーのビジネスレイヤーでエラーが発生しているように見えます。このために増やすことができるメモリ設定はありますか?もしそうなら、それはどれですか?

4

1 に答える 1

5

folder.GetListItems(filter)再帰は、シナリオで大量のリソースを消費します。

マルチメディアアイテムが大量にある場合は、システムに大きな過負荷がかかります。サーバーを拡張しようとしても、ある時点で同じ問題に直面します。

一般に、データ取得のために巨大な操作を実行しようとしているときに、この問題に直面します。

たぶん、同じシナリオを達成するためにさまざまな手法を使用できます(以下はサンプルです)

シナリオ1

イベントシステムを使用すると、バイナリの情報(作成時など)を共通リポジトリ(たとえば、システムコンポーネントのフィールドに格納されているXML)に追加し、そのXMLをときどき公開できます。

たとえば、IDのリストだけが必要な場合は、その情報を格納するために作成されたコンポーネントを使用します。必要に応じて、IDの範囲を定義し、新しいコンポーネントを作成して、1つだけにエントリが多すぎないようにすることもできます(例:0から10000までのIDは、という名前のコンポーネントに格納され、References_0_1000010001から20000までのIDは、という名前のコンポーネントに格納されます。 References_10001_20000)。

シナリオ2

recursive=trueたとえば、メインフォルダ内のサブフォルダを処理するときに、初期ロードをサブロードに分割し(引き続きを使用)、結果をアセンブルします。この場合、folder.GetListItems(filter)負荷を最小限に抑えます。

シナリオ3

それでもfolder.GetListItems(filter)複数回使用しますが、コードに再帰ロジックを実装します。代わりに、フィルターオプションで再帰ロジックを使用し、呼び出しごとに返される結果をアセンブルします。

注: MMCスナップインのTimeOut設定を 確認し、役立つ場合は設定を増やしてください。SDL Tridion Content Manager configuration

于 2012-04-23T20:18:11.123 に答える