从GetListItems发布大结果时出现内存不足错误

时间:2012-04-23 19:21:17

标签: tridion

我在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服务器的业务层中。是否有一个内存设置,我可以为此增加,如果有,这是什么?

1 个答案:

答案 0 :(得分:5)

folder.GetListItems(filter)递归将在您的方案中消耗大量资源。

如果你有大量的多媒体项目,它会给系统增加一个巨大的过载。 即使您尝试扩展服务器,您在某些时候也会面临同样的问题。

通常,当您尝试执行大量数据检索操作时,您将面临此问题。

也许你可以使用不同的技术来实现相同的场景(以下是样本)

情景1

使用事件系统,您可以将二进制文件的信息(何时创建等)添加到公共存储库(例如存储在系统组件字段中的XML)并偶尔发布该XML

如果您只需要一个id列表,请使用为存储该信息而创建的Component。如果需要,您还可以定义一系列ID并创建新组件,因为只有一个条目中没有太多条目(例如:0到10000之间的ID将存储在名为References_0_10000的组件中,ID为10001到100 20000在名为References_10001_20000)的组件中。

场景2

例如,在处理主文件夹中的子文件夹时,拆分Sub-Loads中的初始加载(仍然使用recursive=true),并汇总结果。 在这种情况下,您最小化folder.GetListItems(filter)负载。

场景3

多次使用folder.GetListItems(filter),但在代码中实现递归逻辑,而不是在过滤器选项中使用它,并汇总每次调用返回的结果。

注意:的 检查TimeOut MMC管理单元的SDL Tridion Content Manager configuration设置,并在有帮助的情况下增加这些设置。