On 5/31/11 12:05 AM, Burt Alexander wrote:
Hi, I'm using MINA successfully with one exception.  Sending large Strings between 
a NioSocketAcceptor&  Connector (143 megs)

Do I have to understand that you are transmitting a 143 Mb String ???

If so, here is what is going to happen, if you use the PrefixedStringCodecFactory : a buffer will be used to cumulate the incoming bytes until everything has been received. This buffer will be associated with the session, and resides in memory. That means you will store a 143 Mb buffer in memory...

Add to that the conversion to a String when all the bytes have been received, that means that at a point, you will suck 3 times 143 Mb of memory (143 Mb for the buffer, and as a char is 2 bytes long, 2 times 143 Mb for the String).

Your JVM will be under extreme load for a moment.
  appears to have the effect of losing much of the message.  The acceptor then 
waits for the 'rest' of the message, no exception is thrown.
I'm using the PrefixedStringCodecFactory with the encoder and decoder max length 
set to Integer.MAX_VALUE.  I'd like to be able to throttle the sending of the 
message but I'm unable to determine how I can go about doing it - I've investigated 
using an ExecutorFilter with an IoEventQueueThrottle, a WriteRequestFilter with the 
same, changing read&  write buffer sizes all to no avail.  Using tcp to monitor 
the connection I see output like the following when I lose data:

tcp        0 453224 ::ffff:172.16.9.65:50561    ::ffff:172.16.9.59:33000    
ESTABLISHED 1149/java

Any help will be most appreciated.  Thanks.
Here, if you can provide the snippet of code you are using, that could help. Please also provide the MINA version you are using.

All in all, I'd like to understand why you have to convert the big chunk of data to a String. You may need to implement some other logic to smoothly handled such a transfer. Anyway, I need more info to be able to propose alternatives here.


--
Regards,
Cordialement,
Emmanuel Lécharny
www.iktek.com

Reply via email to