[Twisted-Python] Limit on transport.write
Hi, all I'm writing a program to transfer files over Internet. Sometimes the files would be very big. Therefore, I'm not sure whether I could read a large block of data and send them via one time internet.protocol.transport.write(). On the other hand, does the function internet.protocol.transport.write() have any buffer scheme? If so, I could just read one line of the file each time and call that function. Or if you have any advice on how to transfer large amount of data, please let me know. Really appreciated. Best, Hanks
On Mar 26, 2012, at 2:21 AM, hz hanks wrote:
Hi, all
I'm writing a program to transfer files over Internet. Sometimes the files would be very big. Therefore, I'm not sure whether I could read a large block of data and send them via one time internet.protocol.transport.write(). On the other hand, does the function internet.protocol.transport.write() have any buffer scheme? If so, I could just read one line of the file each time and call that function. Or if you have any advice on how to transfer large amount of data, please let me know. Really appreciated.
First, you want to read this <http://twistedmatrix.com/documents/current/core/howto/producers.html>. Second, you should understand that transport.write() will always buffer; it will never raise an error. The rationale for this behavior is that if you've already got the data as a Python string (as you must, if you're calling write() with it), you have already paid the not-inconsiderable cost of pulling that data into your process, allocating memory for it, and slinging it around in Python, which probably means you've already copied it a few times by splitting it up, moving it around, etc. The transport implementations will endeavor to not copy it around too much more (they generally keep a list of strings around as a buffer rather than a string they keep concatenating to), but they will hold on to it until they're able to write it. If you want to know about the state of the buffer you need to subscribe to it using registerProducer() - so see the above document for how to do that. -glyph
Thank you so much for your instant reply. I guess I need much more time to process the information. You are so helpful. Best, Hanks 2012/3/25 Glyph <glyph@twistedmatrix.com>:
On Mar 26, 2012, at 2:21 AM, hz hanks wrote:
Hi, all
I'm writing a program to transfer files over Internet. Sometimes the files would be very big. Therefore, I'm not sure whether I could read a large block of data and send them via one time internet.protocol.transport.write(). On the other hand, does the function internet.protocol.transport.write() have any buffer scheme? If so, I could just read one line of the file each time and call that function. Or if you have any advice on how to transfer large amount of data, please let me know. Really appreciated.
First, you want to read this <http://twistedmatrix.com/documents/current/core/howto/producers.html>.
Second, you should understand that transport.write() will always buffer; it will never raise an error. The rationale for this behavior is that if you've already got the data as a Python string (as you must, if you're calling write() with it), you have already paid the not-inconsiderable cost of pulling that data into your process, allocating memory for it, and slinging it around in Python, which probably means you've already copied it a few times by splitting it up, moving it around, etc. The transport implementations will endeavor to not copy it around too much more (they generally keep a list of strings around as a buffer rather than a string they keep concatenating to), but they will hold on to it until they're able to write it.
If you want to know about the state of the buffer you need to subscribe to it using registerProducer() - so see the above document for how to do that.
-glyph
_______________________________________________ Twisted-Python mailing list Twisted-Python@twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python
participants (2)
-
Glyph
-
hz hanks