I am working on a GWT based web app for medical image display and
processing. The problem is this kind of medical image do not have the
standarded fomat and it is a huge bytearray (size: over 18M). I have
to directly read the image byte array and send it to the client for
display and further processing. When I transfer a little part of the
image, the client display the pixels normally. But when I transfer the
whole image, the console promotes error:

[ERROR] javax.servlet.ServletContext log: Exception while dispatching
incoming RPC call
java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.Arrays.copyOf(Unknown Source)
        at java.util.ArrayList.ensureCapacity(Unknown Source)
        at java.util.ArrayList.add(Unknown Source)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.append(ServerSerializationStreamWriter.java:
583)
        at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeInt(AbstractSerializationStreamWriter.java:
100)
        at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$VectorWriter$6.write(ServerSerializationStreamWriter.java:233)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeArray(ServerSerializationStreamWriter.java:
639)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
743)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
621)
        at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
126)
        at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:
539)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeClass(ServerSerializationStreamWriter.java:
709)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeImpl(ServerSerializationStreamWriter.java:
748)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serialize(ServerSerializationStreamWriter.java:
621)
        at
com.google.gwt.user.client.rpc.impl.AbstractSerializationStreamWriter.writeObject(AbstractSerializationStreamWriter.java:
126)
        at com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter
$ValueWriter$8.write(ServerSerializationStreamWriter.java:153)
        at
com.google.gwt.user.server.rpc.impl.ServerSerializationStreamWriter.serializeValue(ServerSerializationStreamWriter.java:
539)
        at com.google.gwt.user.server.rpc.RPC.encodeResponse(RPC.java:616)
        at
com.google.gwt.user.server.rpc.RPC.encodeResponseForSuccess(RPC.java:
474)
        at
com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:
571)
        at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:
208)
        at
com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:
248)
        at
com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:
62)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:
511)
        at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1166)
        at
com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:
35)
        at org.mortbay.jetty.servlet.ServletHandler
$CachedChain.doFilter(ServletHandler.java:1157)
        at
com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:
58)

This might be the size limitation of data transfer within GWT, as I've
found other‘s solution like:

encode the byte array by using
com.google.gwt.user.server.Base64Utils.toBase64(byte[]) . But this
method does not work for IE 7. and IE8 has 32kb limit.. IE9 does not
have this limit.

The structure if my project is very simple and clear:

    Client side:

    -ImageService.java

    -ImageServiceAsync.java

    -WebImage.java (interface)

    -ImageArray.java (store the image data from server)

    Server side:

    -ImageServiceImpl.java

I used a button to active this image data delivery. In the background,
ImageServiceImpl read a medical image from disk file and send the data
array to client. Now as the limitation that I metioned above, this
process will not be succesful if I sent the whole image data. How can
I do to complete this process succesfully? I wonder if there is a way
to continuously deliver many small parts (<32kb) of data array from
server to client when I just click the button once. So I can divide
the image into many small parts to perform that. Or there are some
other mechanisms useful for this problem.

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to google-web-toolkit@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to