Hi Andrew,
Your best starting point is to get rid of XMLBeans. XMLBeans always
stores raw XML in memory, so there's no way to avoid the memory issues
with large messages.
ADB would avoid some of the overhead, in that it would convert the XML
message to an object graph, which would typically be a factor of 2-5x
smaller than the raw XML data (depending on the type of data in your
message).
JiBX would do at least as well as ADB in terms of the reduced-size
object graph. If you have some way of breaking up the response data into
more easily-digestible chunks, JiBX would also allow you to do
piece-meal processing of the message (by creating a fake collection, for
instance, where your data objects expose an addXXX() method which just
writes the object being added to some backing store rather than adding
it to an in-memory collection). Piece-meal processing is the only way
you can dramatically decrease your memory usage and handle messages of
effectively unlimited size without a problem.
- Dennis
--
Dennis M. Sosnoski
SOA and Web Services in Java
Axis2 Training and Consulting
http://www.sosnoski.com - http://www.sosnoski.co.nz
Seattle, WA +1-425-939-0576 - Wellington, NZ +64-4-298-6117
Andrew Bruno wrote:
Mr J,
But its just one data element that I need, so there is no concept many
rows, etc.
As a matter of fact, I am breaking up the call in 2 calls, one for all
the metadata, and one for the actual mime content.
i.e.
<m:ResponseMessages>
<m:GetItemResponseMessage ResponseClass="Success">
<m:ResponseCode>NoError</m:ResponseCode>
<m:Items>
<t:Message>
<t:MimeContent CharacterSet="UTF-8">RnJvbTogTGVlIF.....
large mime base64 encoded email......... 120Meg++ of encoded
data</t:MimeContent>
....
I only ever request one message at a time. Its just that when the
MimeContent is greater then 10Meg, OutOfmemory occurs.
It appears to be the case because the parse loads all the content into
memory.
In theory, this element can have data of any size coming back.
On Mon, May 18, 2009 at 6:54 PM, J. Hondius <[email protected]
<mailto:[email protected]>> wrote:
I'd think about a different design of the webservice calls.
You should try to avoid real big results.
Split into more calls.
Something like:
One to get a overview list
Another to get details
Or:
One call to get the size like the SQL count() does
combined with
Add parameters to your to limit the result: like start_at,
number_of_results
my 2c
Andrew Bruno schreef:
Hello all
I was wondering how some of you may be dealing with web
service calls
that result in extremely large data responses?
I have been struggling in trying to change the way the parsing
of the
XML response works, as I am getting out of memory errors
java.lang.OutOfMemoryError: Java heap space
at
org.apache.xmlbeans.impl.store.CharUtil.allocate(CharUtil.java:397)
at
org.apache.xmlbeans.impl.store.CharUtil.saveChars(CharUtil.java:506)
at
org.apache.xmlbeans.impl.store.CharUtil.saveChars(CharUtil.java:419)
at
org.apache.xmlbeans.impl.store.CharUtil.saveChars(CharUtil.java:489)
at
org.apache.xmlbeans.impl.store.Cur$CurLoadContext.text(Cur.java:2911)
at
org.apache.xmlbeans.impl.store.Cur$CurLoadContext.stripText(Cur.java:3113)
at
org.apache.xmlbeans.impl.store.Cur$CurLoadContext.text(Cur.java:3126)
at
org.apache.xmlbeans.impl.store.Locale.loadXMLStreamReader(Locale.java:1154)
at
org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:843)
at
org.apache.xmlbeans.impl.store.Locale.parseToXmlObject(Locale.java:826)
at
org.apache.xmlbeans.impl.schema.SchemaTypeLoaderBase.parse(SchemaTypeLoaderBase.java:231)
.....
Is there a way to change the parser to use a temp file rather then
trying to buffer the response in memory?
Should I be directing this question to the developers list?
Or should I be thinking differently on solving this problem?
Please any ideas :(
Thank you
Andrew