【问题标题】:Download files asynchronously through FTP in javajava中通过FTP异步下载文件
【发布时间】:2018-07-16 07:52:30
【问题描述】:

我需要在 java 中通过 FTP 下载多个文件。为此,我使用 FTPClient 编写了一个代码,该代码一个一个地下载文件。 我需要从服务器获取文件并下载到另一个网络。编写代码后,我发现下载每个文件都需要更多时间,因为文件很大(超过 10GB)。我决定对进程进行多线程处理,即一次运行多个文件。任何人都可以帮助我在多线程环境中编写 FTP。 虽然我觉得多线程无济于事,因为网络带宽将保持不变并且会在多个线程之间划分并导致再次缓慢下载。请推荐!!

【问题讨论】:

    标签: java multithreading ftp ftp-client


    【解决方案1】:

    你有不同的东西要先检查:

    • 您的下载速度
    • 远程服务器上传速度
    • 每个连接的最大服务器上传速度

    如果服务器将单个文件的传输速度限制在低于其最大传输速度的阈值,您可以通过使用多线程获得一些优势(例如,每个连接的限制为 10 Kb/s 和最大上传100 Kb/s,理论上可以并行下载 10 次)。如果没有,多线程将无济于事。

    此外,如果您的下载已饱和(您的所有带宽都被单个下载填满,或者服务器的上传带宽大于您的下载),您将无法通过多线程获得任何帮助。

    如果您的多线程有用,只需为每个文件实例化一个新连接并将其放入单独的线程中。

    【讨论】:

    • 感谢您的建议!谈到下载速度——我可以看到我的文件以 10kb/s 的速度下载到网络上,单个文件大约需要 45 分钟才能下载一个 8GB 的​​文件。因此,当我有 5 个大小超过 10GB 的文件并并行运行它们时,我想知道它会如何响应。虽然手动下载所花费的时间要少一些,但我们想通过 java 自动下载!!虽然,当我们运行多个文件时,不确定服务器如何将文件限制在阈值范围内。
    【解决方案2】:

    我觉得多线程无济于事,因为网络带宽将保持不变,并且会在多个线程之间划分并导致再次缓慢下载。

    这很可能是真的。事实上,如果您有太多线程试图同时下载文件,您可能会导致 FTP 服务器超载或导致网络拥塞。两者都可能导致整体数据速率净降低

    解决方案是为下载线程使用有界线程池,并调整池大小。

    在可能的情况下重用连接也是一个好主意,因为创建连接和对用户进行身份验证需要时间......以及两端的 CPU 资源。

    【讨论】:

    • 感谢@Stephen C 的建议!有界线程池对我来说是新的..你能给出相同的参考吗?此外,不确定调整池大小。
    • 1) 简单的方法是使用 ExecutorService;请参阅执行程序 javadoc。 2) 调整、测量、重复。
    猜你喜欢
    • 1970-01-01
    • 2012-08-18
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多