5

我在 64 位服务器上使用 SDL Tridion 2009 SP1 并尝试发布系统中所有多媒体组件的大量 XML (190K+)。我正在使用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 并创建新的组件,因为只有一个没有太多条目(例如:从 0 到 10000 的 id 将存储在名为 的组件中References_0_10000,从 10001 到 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 回答