commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Geoffrey Hardy (JIRA)" <>
Subject [jira] [Reopened] (NET-550) Default FTPClient bufferSize results in very slow retrieve transfers
Date Thu, 07 Aug 2014 17:18:12 GMT


Geoffrey Hardy reopened NET-550:

I _strongly_ disagree that this is a duplicate.  My complaint is the _default_ value for bufferSize.
 I read several existing bug reports before posting this, but nothing directly addresses the
default value of zero.  

I also looked at the source code in the head, and bufferSize still has a default size of zero.
 This is very annoying for new users of the client library -- it causes a dramatic effect
on performance, and is very difficult to diagnose.  I discovered this by accident, and it
took a lot of testing to figure it out.

I also tried the proposed solution -- downloading a 3.4 snapshot -- but that did *not* resolve
the problem for me.

> Default FTPClient bufferSize results in very slow retrieve transfers
> --------------------------------------------------------------------
>                 Key: NET-550
>                 URL:
>             Project: Commons Net
>          Issue Type: Bug
>    Affects Versions: 3.3
>            Reporter: Geoffrey Hardy
> While experimenting with FTPClient, I discovered that if I don't call setBufferSize(),
the default value is zero.  This results in retrieveFile() calling the version of
with no parameters, reading one byte at a time.  For comparison, the downloading a CD ISO
image of about ~648MB took 18m10s with the default settings.  In contrast, calling setBufferSize(8192)
took only 7.9s, an improvement of ~137x.
> Here is some sample code:
> {code:java}
> FTPClient ftp = new FTPClient();
> // ftp.setBufferSize(8192);
> ftp.setControlKeepAliveTimeout(300);
> ftp.setCopyStreamListener(new CopyStreamListener() {
>     @Override
>     public void bytesTransferred(long totalBytesTransferred, int bytesTransferred, long
streamSize) {
>         System.out.println("totalBytesTransferred: " + totalBytesTransferred
>             + ", bytesTransferred: " + bytesTransferred + ", streamSize: " + streamSize);
>     }
>     @Override public void bytesTransferred(CopyStreamEvent event) {}
> });
> ftp.connect(host);
> ftp.login(user, pass);
> ftp.retrieveFile(file, outputStream);
> {code}
> The log message from the stream listener printed lots messages "bytesTransferred: 1"
and totalBytesTransferred incremented by 1 each time.  This corresponds to the part of the
code which reads one byte at a time with {{int}}.

This message was sent by Atlassian JIRA

View raw message