urllib2 performance on windows, usb connection
dq
dq at gmail.com
Fri Feb 6 18:40:00 EST 2009
MRAB wrote:
> dq wrote:
>> MRAB wrote:
>>> dq wrote:
>>>> Martin v. Löwis wrote:
>>>>>> So does anyone know what the deal is with this? Why is the
>>>>>> same code so much slower on Windows? Hope someone can tell
>>>>>> me before a holy war erupts :-)
>>>>>
>>>>> Only the holy war can give an answer here. It certainly has
>>>>> *nothing* to do with Python; Python calls the operating system
>>>>> functions to read from the network and write to the disk almost
>>>>> directly. So it must be the operating system itself that slows
>>>>> it down.
>>>>>
>>>>> To investigate further, you might drop the write operating, and
>>>>> measure only source.read(). If that is slower, then, for some
>>>>> reason, the network speed is bad on Windows. Maybe you have the
>>>>> network interfaces misconfigured? Maybe you are using wireless
>>>>> on Windows, but cable on Linux? Maybe you have some network
>>>>> filtering software running on Windows? Maybe it's just that
>>>>> Windows sucks?-)
>>>>>
>>>>> If the network read speed is fine, but writing slows down, I
>>>>> ask the same questions. Perhaps you have some virus scanner
>>>>> installed that filters all write operations? Maybe Windows
>>>>> sucks?
>>>>>
>>>> Thanks for the ideas, Martin. I ran a couple of experiments to find
>>>> the culprit, by downloading the same 20 MB file from the
>>>> same fast server. I compared:
>>>>
>>>> 1. DL to HD vs USB iPod.
>>>> 2. AV on-access protection on vs. off
>>>> 3. "source. read()" only vs. "file.write( source.read() )"
>>>>
>>>> The culprit is definitely the write speed on the iPod. That is,
>>>> everything runs plenty fast (~1 MB/s down) as long as I'm not
>>>> writing directly to the iPod. This is kind of odd, because if I
>>>> copy the file over from the HD to the iPod using windows
>>>> (drag-n-drop), it takes about a second or two, so about 10 MB/s.
>>>>
>>>> So the problem is definitely partially Windows, but it also seems
>>>> that Python's file.write() function is not without blame. It's
>>>> the combination of Windows, iPod and Python's data stream that is
>>>> slowing me down.
>>>>
>>>> I'm not really sure what I can do about this. I'll experiment a
>>>> little more and see if there's any way around this bottleneck.
>>>> If anyone has run into a problem like this, I'd love to hear
>>>> about it...
>>>>
>>> You could try copying the file to the iPod using the command line,
>>> or copying data from disk to iPod in, say, C, anything but Python.
>>> This would allow you to identify whether Python itself has anything
>>> to do with it.
>>
>> Well, I think I've partially identified the problem. target.write(
>> source.read() ) runs perfectly fast, copies 20 megs in about a
>> second, from HD to iPod. However, if I run the same code in a while
>> loop, using a certain block size, say target.write( source.read(4096)
>> ), it takes forever (or at least I'm still timing it while I write
>> this post).
>>
>> The mismatch seems to be between urllib2's block size and the write
>> speed of the iPod, I might try to tweak this a little in the code and
>> see if it has any effect.
>>
>> Oh, there we go: 20 megs in 135.8 seconds. Yeah... I might want to
>> try to improve that...
>>
> How long does it take to transfer 4KB? If it can transfer 1MB/s then I'd
> say that 4KB is too small. Generally speaking, the higher the data rate,
> the larger the blocks you should be transferring at a time, IMHO.
>
> You could write a script to test the transfer speed with different block
> sizes.
Thanks MRAB, 32 or 64 KB seems to be quickest, but I'll do a more
scientific test soon and see what turns up.
More information about the Python-list
mailing list