[Twisted-Python] Sending a long string/buffer without copying it

Brian Granger ellisonbg.net at gmail.com
Thu Sep 28 00:11:41 MDT 2006


HI,

In one of my Twisted based applications, I need to send large string
and buffers.  They can be 100's of MB's long (they come from large
numpy arrays).  I would like to be able to send them *without making
any copies* in the process.

This seems to be dificult with the way that certain parts of Twisted
are written:

in protocols.basic many of the sendString/sendLine method having
things that make a copy of the string or line to be send:

    def sendLine(self, line):
        """Sends a line to the other end of the connection.
        """
        return self.transport.write(line + self.delimiter)

If line is 100MB, this just made a second 100MB string.  To make
things worse, in my case a server needs to send this line to many
clients that are connected.  The line gets copied for each client!  If
I have 10 clients, I have nearly a GB worth of extra memory allocated
for this temporary copy.

This problem is easy solve at the protocol level: you just do separate
writes for the delimiter and the line.  Or if you are using a length
prefixed protocol, write the length bytes and the string separately.

BUT....

Even if I do that, it appears that Twisted is making copies elsewhere
- like in FileDescriptor.doWrite.  So, how can I send something
without making a copy?  I don't mind making copies of slices, just not
the whole thing.

Thanks

Brian




More information about the Twisted-Python mailing list