在Java中下载了几个文件后,下载速度急剧降低

在Java中下载了几个文件后,下载速度急剧降低,java,networking,download,wget,Java,Networking,Download,Wget,我正试图从SEC下载数据。我在本地下载,上传到AmazonS3,然后在本地删除这些文件。这些文件的大小范围约为10-100MB。下载几个文件后,下载速度会显著降低 下面是我的一个输出示例。请忽略5761中的190内容;我从189开始,所以前面的条目不下载。所以这里发生的事情是,进程启动并以高速下载3个文件,总共约112MB。随后,它只能以2-3MB/s的速度下载,而且永远不会恢复到最初的速度(即使在20多个文件之后,这是我让它运行的最长时间)。我还包括了上传速度——这些似乎没有降低质量,不确定这

我正试图从SEC下载数据。我在本地下载,上传到AmazonS3,然后在本地删除这些文件。这些文件的大小范围约为10-100MB。下载几个文件后,下载速度会显著降低

下面是我的一个输出示例。请忽略5761中的
190
内容;我从189开始,所以前面的条目不下载。所以这里发生的事情是,进程启动并以高速下载3个文件,总共约112MB。随后,它只能以2-3MB/s的速度下载,而且永远不会恢复到最初的速度(即使在20多个文件之后,这是我让它运行的最长时间)。我还包括了上传速度——这些似乎没有降低质量,不确定这是否相关

        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961220.nc.tar.gz
        Elapsed: 0.934
        Size was 33 MB. Avg speed was 26 MB/s. 
        Finished uploading. Speed was 32 MB/s.
Downloading 190 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961223.nc.tar.gz (current total: 33 MB; average speed: 14 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961223.nc.tar.gz
        Elapsed: 1.523
        Size was 41 MB. Avg speed was 26 MB/s.
        Finished uploading. Speed was 59 MB/s.
Downloading 191 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961224.nc.tar.gz (current total: 74 MB; average speed: 16 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961224.nc.tar.gz
        Elapsed: 0.479
        Size was 38 MB. Avg speed was 79 MB/s.
        Finished uploading. Speed was 63 MB/s.
Downloading 192 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961226.nc.tar.gz (current total: 112 MB; average speed: 20 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961226.nc.tar.gz
        Elapsed: 3.859
        Size was 10 MB. Avg speed was 2 MB/s.
        Finished uploading. Speed was 37 MB/s.
Downloading 193 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961227.nc.tar.gz (current total: 122 MB; average speed: 12 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961227.nc.tar.gz
        Elapsed: 8.327
        Size was 30 MB. Avg speed was 3 MB/s.
        Finished uploading. Speed was 55 MB/s.
额外信息:

  • 我很确定它在服务器上没有速率限制,因为当我在当前正在下载的URL上运行单独的
    wget
    命令行时,下载速度很快
  • 我不会把这些文件保存在内存中
  • 我已经运行了好几次,在2-10次快速下载后,这种行为会持续发生
  • 我将文件上传到单独的服务器后立即删除它们
  • CPU和内存使用不会随着进程的运行而急剧增加
  • 实际的文件/URL似乎无关紧要:我可以从任何索引(而不是189)开始下载,行为也是一样的
  • 我在AmazonEC2上运行它,并安装了全新的OpenJDK1.8
我尝试了两种不同的文件下载实现,但两个版本都有相同的问题。以下是我的下载实现。您可以从wget实现中特别看到,这个瓶颈发生在单个
wget
进程中,因为
经过的时间在下载速度下降后增加

使用Apache
FileUtils下载

public static File downloadFileFromURL(String tmpPrefix, String url) throws IOException {
    File tmp = File.createTempFile(tmpPrefix, null);
    tmp.deleteOnExit();
    FileUtils.copyURLToFile(new URL(url), tmp);
    return tmp;
}
通过调用
wget

public static File downloadFileFromURLViaWget(String url) throws IOException, InterruptedException {
    System.out.println("\tDownloading via wget: " + url);
    long start = System.currentTimeMillis();
    Process pr = Runtime.getRuntime().exec(new String[]{"wget", "-nv", url});
    pr.waitFor();
    System.out.println("\tElapsed: " + (System.currentTimeMillis() - start) / 1000.0);
    String fileName = url.substring(url.lastIndexOf('/') + 1);
    File f = new File(fileName);
    f.deleteOnExit();
    return f;
}

我真的很感谢你对这方面的任何见解。我四处搜索过,但没有找到任何其他关于这个问题的帖子。

当你说你不认为这是一个费率限制问题时,出于好奇,你是在使用他们的API并将其与wget进行比较,还是FileUtils与wget进行比较?他们没有API,这只是一个设计为易于刮取的网站。所以我所拥有的就是一堆直接指向文件的URL。我现在运行的Java代码版本实际上只是创建了一个
wget
进程,但它开始变慢。同时,我可以在同一台机器的另一个屏幕上调用
wget
,它以正常的高速下载。据我所知,服务器不可能知道正在调用哪个进程,只能知道我的IP正在请求数据。因此,由于一个
wget
是快的,而来自同一台机器的其他机器是慢的,我不认为这是速率限制。这是杂乱无章的。澄清一下:我的代码使用
wget
下载。两次
wget
s后,速度会减慢。但是当我的代码运行时,我可以在同一个URL上手动执行
wget
,而且速度很快。啊,我明白了。谢谢你的澄清。你是在线程庄园中运行这些作业,还是像在for循环中一样在队列中运行这些作业?所以有很多我看不到的东西,但都是高层次的。(1) 您可能想尝试使用线程,类似这样的方法可能会有所帮助:另外,请记住,如果您正在执行wget,并将其与下载文件进行比较,将其推送到s3存储桶,然后清除,这肯定不会是苹果对苹果,但请再次尝试线程。此外,实现异步策略也可能有所帮助。。