I have a CFMX script that continually comes close (and sometimes succeeds) in
eating up all of the CFMX sever's memory. I've put tracking code in various
places to watch the memory stats (using calls to
CreateObject("java","java.lang.Runtime").getRuntime() ). I've also tried
running (while this script is executing) another page that uses the
runtime.gc() call to force a garbage collect, which only has a negligable
effect on the memory usage. I can run this on a testing server, to be sure
that some other script isn't the real culprit, but see the same results.
Here is what the script does:
Run a query to determine which accounts need processing
Loop over that query (usually about 300 records):
1. Build a 10 line XML doc. Use the same var name for this doc everytime
2. CFHTTP that doc to a website/service, get another XML doc back.
3. XMLParse the returned doc
4. Create a Query var, using the same var name everytime
5. Loop over the parsed XML doc, creating a row in the Query var with
about 20 calls to QuerySetCell for each pass over the XML doc.
6. Loop over the Query structure created in step 5, and do 3 CFQUERY
INSERTs to a various tables
That's it! Note that for each iteration through the main loop I already know
how many records will be returned from the website I'm HTTPing to, and I
throttle it to only return 200 at a time (ie, I might make multiple passes
through steps 1-5 whenever I know that there are more than 200 records to be
returned.
Note also that I'm still trying to figure out why this was written to even
create the intermediate query to begin with (instead of just looping over the
XML doc to do the database inserts).
Are there any known problems with creating the same query var over and over? Or
creating the same XML doc over and over?
I've seen this problem with memory being eaten up when I execute a QoQ with the
same name over and over (around 1000 times or more), and got around that by
using array and list functions instead QoQ table lookups.
If this were a "normal" memory problem then I'd expect the periodic calls for a
garbage collection to help out, but like I said, those calls are having just
about 0 effect.
I'm running the latest CFMX update, and have upped the maxmem for JVM to 1200.
I'm going juts on this one, since the script is pretty simple and
straightforward - just a lot of looping! I'm looking at trying to break it up,
but that's going to take some time.
TIA!
Reed
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Introducing the Fusion Authority Quarterly Update. 80 pages of hard-hitting,
up-to-date ColdFusion information by your peers, delivered to your door four
times a year.
http://www.fusionauthority.com/quarterly
Archive:
http://www.houseoffusion.com/groups/CF-Talk/message.cfm/messageid:252746
Subscription: http://www.houseoffusion.com/groups/CF-Talk/subscribe.cfm
Unsubscribe:
http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=11502.10531.4