2012-04-23 8 views
5

Estoy usando SDL Tridion 2009 SP1 en un servidor de 64 bits e intento publicar un XML masivo de todos los componentes multimedia en el sistema (190K +). Estoy usando el método folder.GetListItems(filter) con el filtro configurado en Recursive="true".Error de memoria insuficiente al publicar un resultado grande de GetListItems

La plantilla tiene una duración de varios segundos y luego explota con un error de falta de memoria:

<?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() 

Desde el Seguimiento de la pila se ve como si el error está ocurriendo en la capa de negocio del servidor CM. ¿Existe una configuración de memoria que pueda aumentar para esto? De ser así, ¿cuál es?

Respuesta

5

folder.GetListItems(filter) recursivo va a consumir una gran cantidad de recursos en su escenario.

Si tiene una gran cantidad de elementos multimedia, está agregando una enorme sobrecarga al sistema. Incluso si intenta escalar el servidor, se enfrentará al mismo problema en algún momento.

En general, se enfrentará a este problema ya que está tratando de realizar una gran operación de recuperación de datos.

Tal vez se pueden utilizar diferentes técnicas para lograr el mismo escenario (Los siguientes son muestras)

Escenario 1

Uso del sistema de eventos, puede añadir información de la binaria (cuando se crea, etc ...) a un repositorio común (por ejemplo, un XML almacenado en un campo de un Componente del Sistema) y publicar ese XML de vez en cuando.

Si solo necesita una lista de identificadores, por ejemplo, use un Componente creado para almacenar esa información. También puede definir un rango de ids y crear nuevos componentes, si es necesario, por no tener demasiadas entradas en una sola (ejemplo: los ids de 0 a 10000 se almacenarán en un componente llamado References_0_10000, ids de 10001 a 20000 en un componente llamado References_10001_20000).

Escenario 2

Dividir la carga inicial en Sub-cargas (todavía utilizando los recursive=true) al procesar las subcarpetas dentro de la carpeta principal por ejemplo, y ensamblar los resultados. En este caso, minimiza la carga folder.GetListItems(filter).

Escenario 3

Uso todavía los folder.GetListItems(filter) múltiples veces, pero implementar la lógica recursiva en su código, en lugar de usar que en las opciones de filtro, y ensamblar los resultados devueltos por cada llamada.

Nota: Verificar los ajustes del TimeOutSDL Tridion Content Manager configuration MMC y aumentar las del caso que ayuda.

+0

Gracias Miguel. Vamos a dividir el proceso en un grupo de subcarpetas (según su segunda sugerencia). Sin embargo, me gusta mucho su sugerencia en el escenario 1 con el sistema de eventos. –

+0

contento de que haya sido útil Nickoli. Este tipo de carga siempre causa problemas cuando hay una gran cantidad de artículos. Agregué un escenario 3 como otro ejemplo – Miguel

Cuestiones relacionadas