2012-04-23 11 views
5

Używam SDL Tridion 2009 SP1 na 64-bitowym serwerze i próbuję opublikować ogromny XML wszystkich komponentów multimedialnych w systemie (190K +). Używam metody folder.GetListItems(filter) z filtrem ustawionym na Recursive="true".Błąd braku pamięci podczas publikowania dużego wyniku z GetListItems

Szablon działa przez kilka sekund, a następnie wysadza z poza błędu pamięci:

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

ze stosu prześledzić to wygląda tak, jakby błąd dzieje się w warstwie biznesowej serwera CM. Czy istnieje ustawienie pamięci, które mogę zwiększyć, a jeśli tak, to co to jest?

Odpowiedz

5

folder.GetListItems(filter) Recursive zużyje ogromną ilość zasobów w swoim scenariuszu.

Jeśli masz dużą ilość elementów multimedialnych, to dodajesz ogromne przeciążenie do systemu. Nawet jeśli spróbujesz przeskalować serwer, w pewnym momencie napotkasz ten sam problem.

Zasadniczo napotkasz ten problem, próbując wykonać ogromną operację odzyskiwania danych.

Może można użyć różnych technik do osiągnięcia tego samego scenariusza (Poniżej przedstawiono próbek)

Scenariusz 1

przy użyciu systemu zdarzeń można dodawać informacje binarne (gdy jest tworzony, etc ...) do wspólnego repozytorium (np. XML przechowywany w polu System Component) i raz na jakiś czas publikuje ten XML.

Jeśli potrzebujesz tylko listy identyfikatorów na przykład, użyj komponentu utworzonego do przechowywania tych informacji. Można również zdefiniować zakres identyfikatorów i utworzyć nowe komponenty, jeśli jest to wymagane, ponieważ nie ma zbyt wielu wpisów w jednym (przykład: identyfikatory od 0 do 10000 będą przechowywane w komponencie o nazwie References_0_10000, identyfikatory od 10001 do 20000 w komponencie o nazwie References_10001_20000).

Scenariusz 2

Podział obciążenia w początkowej Sub-ładunku (nadal używa recursive=true) podczas przetwarzania podkatalogów w katalogu głównego, na przykład, i łączą wyniki. W takim przypadku należy zminimalizować obciążenie folder.GetListItems(filter).

Scenariusz 3

Zastosowanie nadal folder.GetListItems(filter) wielokrotnie ale realizować rekurencyjną logiki w kodzie, zamiast tego użyć w opcjach filtrów i montujemy wyników zwróconych za każdym połączeniu.

Uwaga: Sprawdź te TimeOut ustawienia SDL Tridion Content Manager configuration MMC Snap-in i zwiększyć w przypadku tych, które pomaga.

+0

Dzięki Miguel. Zamierzamy podzielić ten proces na kilka podfolderów (zgodnie z drugą sugestią). Chociaż bardzo podoba mi się twoja sugestia w scenariuszu 1 z systemem zdarzeń. –

+0

Cieszę się, że przydał się Nickoli. Ten rodzaj obciążenia zawsze powoduje problemy, gdy istnieje ogromna ilość przedmiotów. Dodałem scenariusz 3 jako inny przykład – Miguel

Powiązane problemy