2015-03-24 10 views
6

ich Schleife versuche über eine 2-D Array, deren Abmessungen 12000 * 20 und ich bin immer kontinuierlich java.lang.OutOfMemoryError.Vermeiden Haufen Fehler während in Coldfusion Looping

Anfangs dachte ich, dies könnte wegen der Größe des Heapspeichers sein, also erhöhte ich meine Heap-Größe, aber ich bekam immer noch den gleichen Fehler. Also lief ich einen Garbage Collector wie folgt aus:

<cflock name="checkMemory" type="exclusive" timeout="1" throwontimeout="yes"> 
    <cfset objSystem = CreateObject("java", "java.lang.System")> 
    <cfset objSystem.gc()> 
</cflock> 

und ich abgeladen den freien Speicher, der um 850MB war:

<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()> 
<cfset freeMemory = runtime.freeMemory()> 
<cfdump var="#freeMemory#" label="free"> 

Hier Ich versuche, eine XML-Variable zu erstellen und während Looping ich Heap bin immer Fehler:

<cfxml variable="variables.XML"> 
    <cfoutput> 
    <ROWS> 
     <cfloop from="3" to="#arrayLen(local.array)#" index="i" step="1"> 
     <ROW> 
      <cfloop from="1" to="#arrayLen(local.array[2])#" index="j" step="1"> 
      <#ucase(local.array[2][j])#> 
       <![CDATA[#trim(local.array[i][j])#]]> 
      </#ucase(local.array[2][j])#> 
      </cfloop> 
     </ROW> 
     </cfloop> 
    </ROWS> 
    </cfoutput> 
</cfxml> 

Dies ist der Stack-Trace:

java.lang.OutOfMemoryError at java.io.WinNTFileSystem.getBooleanAttributes(Native Method) at java.io.File.exists(File.java:733) at coldfusion.xml.XmlProcessor.getSourceURL(XmlProcessor.java:246) at coldfusion.xml.XmlProcessor.parse(XmlProcessor.java:155) at coldfusion.tagext.lang.XmlTag.doEndTag(XmlTag.java:85) at cffeeds2ecfc1003675922$funcDEMO1._factor8(C:\component\abc.cfc:1235) at cffeeds2ecfc1003675922$funcDEMO1.runFunction(C:\component\abc.cfc:1192) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220) at coldfusion.runtime.CfJspPage._invokeUDF(CfJspPage.java:2582) at cffeeds2ecfc1003675922$funcDEMO.runFunction(\component\abc.cfc:935) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472) at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405) at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368) at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55) at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321) at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:517) at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:496) at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:355) at coldfusion.filter.ComponentFilter.invoke(ComponentFilter.java:188) at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:374) at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48) at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40) at coldfusion.filter.PathFilter.invoke(PathFilter.java:94) at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70) at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28) at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38) at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46) at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38) at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22) at coldfusion.xml.rpc.CFCServlet.invoke(CFCServlet.java:139) at coldfusion.xml.rpc.CFCServlet.doPost(CFCServlet.java:290) at javax.servlet.http.HttpServlet.service(HttpServlet.java:760) at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBase.java:327) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89) at jrun.servlet.FilterChain.doFilter(FilterChain.java:86) at com.intergral.fusionreactor.filter.FusionReactorFilter.i(FusionReactorFilter.java:566) at com.intergral.fusionreactor.filter.FusionReactorFilter.c(FusionReactorFilter.java:258) at com.intergral.fusionreactor.filter.FusionReactorFilter.doFilter(FusionReactorFilter.java:164) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42) at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46) at jrun.servlet.FilterChain.doFilter(FilterChain.java:94) at jrun.servlet.FilterChain.service(FilterChain.java:101) at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106) at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42) at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286) at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543) at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203) at jrunx.scheduler.ThreadPool$DownstreamMetrics.invokeRunnable(ThreadPool.java:320) at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428) at jrunx.scheduler.ThreadPool$UpstreamMetrics.invokeRunnable(ThreadPool.java:266) at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)

Gibt es eine bessere Lösung, um Schleifen zu vermeiden oder diesen Fehler zu beheben?

Ich habe eine cfm Seite lokal und einige Variablen in es wie folgt hinzugefügt:

<cfset runtime = CreateObject("java","java.lang.Runtime").getRuntime()> 
<cfset freeMemory = runtime.freeMemory()> 
<cfset totalMemory = runtime.totalMemory()> 
<cfset maxMemory = runtime.maxMemory()> 
<cfdump var="#freeMemory#" label="free"> 
<cfdump var="#totalMemory#" label="total"> 
<cfdump var="#maxMemory#" label="max"> 

Jedes Mal, wenn ich diese Seite war erfrischend, die Größe freien Speicher abnimmt, bis ich die GC lief. Ich versuche immer noch herauszufinden, warum das passiert. Irgendwelche Vorschläge diesbezüglich?

Bitte helfen. Vielen Dank im Voraus.

+0

Der relevante Teil des Codes wäre hier das Bit, das Sie abkürzen als ' // Etwas Operation'. Es ist unmöglich zu sagen, was man tun kann, um den Code speicherfreundlicher zu machen, ohne ihn zu sehen. –

+0

@AdamCameron Ich habe meine Frage aktualisiert. – Beginner

+0

Also ist 'array2' eigentlich nicht das Sub-Array von 'array', es ist nur ein anderer Bereich von gleicher Länge, der alle XML-Knoten definiert? Es kann hilfreich sein zu zeigen, wie Sie Ihre Array-Variablen erstellen, um dies zu bestätigen. Ich würde versucht sein, nur UCase zu verwenden, wenn Sie Array2 auffüllen, wodurch 12000 * 20 * 2 Funktionsaufrufe reduziert werden. – duncan

Antwort

1

Nach den Vorschlägen von Adam Cameron, Dan Bracuk und James Moberg habe ich Folgendes getan und ich bekomme jetzt nicht den Heap-Fehler. Ich vermute, dass es wegen CFXML Tags aber nicht sicher war.

Umwandlung aller Element array[2] in Großbuchstaben:

<cfloop from="1" to="#arrayLen(local.array[2])#" index="i" step="1"> 
    <cfset local.array[2][i] = ucase(local.array[2][i])> 
</cfloop> 

Dann cfsavecontent mit der XML-Zeichenfolge zu generieren:

<cfsavecontent variable="local.xmlString"> 
    <?xml version="1.0" encoding="UTF-8"?> 
    <ROWS> 
    <cfoutput> 
     <cfloop from="3" to="#arrayLen(local.array)#" index="local.currentRow" step="1"> 
     <ROW> 
      <cfloop from="1" to="#arrayLen(local.array[2])#" index="local.currentColumn" step="1"> 
      <#local.array[2][local.currentColumn]#> 
       <![CDATA[#trim(local.array[local.currentRow][local.currentColumn])#]]> 
      </#local.array[2][local.currentColumn]#> 
      </cfloop> 
     </ROW> 
     </cfloop> 
    </cfoutput> 
    </ROWS> 
</cfsavecontent> 
<cfset local.xml = xmlParse(local.xmlString)>