You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Geoffrey Hardy (JIRA)" <ji...@apache.org> on 2015/05/07 17:21:00 UTC

[jira] [Reopened] (NET-550) Default FTPClient bufferSize results in very slow retrieve transfers

     [ https://issues.apache.org/jira/browse/NET-550?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Geoffrey Hardy reopened NET-550:
--------------------------------

I commented on this issue in Aug 2014 that I didn't agree that it was a duplicate.  The problem is with the _default_ value of {{bufferSize}}.  I'm reopening this because the default value causes the library to be extremely inefficient.  There is a workaround--to set the value of {{bufferSize}} explicitly, but I think it should have a more reasonable default value--e.g., 4KB.

> Default FTPClient bufferSize results in very slow retrieve transfers
> --------------------------------------------------------------------
>
>                 Key: NET-550
>                 URL: https://issues.apache.org/jira/browse/NET-550
>             Project: Commons Net
>          Issue Type: Bug
>    Affects Versions: 3.3
>            Reporter: Geoffrey Hardy
>             Fix For: 3.4
>
>         Attachments: net-buffercopy-ext.patch, net-buffercopy.patch
>
>
> 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 InputStream.read() 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 inputStream.read()}}.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)