gpt4 book ai didi

java - 在 Java 中并行化网络绑定(bind) for 循环

转载 作者:行者123 更新时间:2023-12-02 12:41:02 24 4
gpt4 key购买 nike

我有一个包含 100 万个文件名的列表,必须从 S3 下载。目前,我正在逐一下载每个文件(下面的 for 循环),下载完成大约需要 4 天。

    for (String fileName : Files) {
InputStream is = null;
try {
is = m_S3.downloadFile(fileName); // m_s3 is a wrapper around AmazonS3 client
m_localDisk.createFile(fileName, is); // m_localDisk is an interface for local disk storage.
}
catch (Exception e) {
System.out.println("Exception happened");
}
finally {
is.close();
}
}

由于 S3 允许并行连接,我计划并行下载。我怎样才能在Java中做到这一点?我在 C 中使用 Pthread 做了类似的事情,我只是将输入和委托(delegate)线程与上下文中输入的不同部分分开。我可以在 Java 中做到这一点,但我确信有更好、更高级别的方法可以做到这一点。

我考虑过使用parallelStreams之类的东西,但由于它只使用管道机制,我认为它不会给我带来太大的改进——只有一个到S3的网络连接 code> 将一次打开。

最佳答案

使用parallelStream可能是解决此问题的最简单方法。
默认 AmazonS3Client 最多可处理 50 个并发连接,但您可以对其进行不同的配置。

默认情况下,parallelStream() 使用共享系统线程池,具有 numOfProcessors -1 个线程,以下方法创建您自己的线程池,您可以调整大小符合您自己的愿望,而且长时间运行的阻塞任务不会干扰系统池上运行的其他事物。

List<String> fileNames = ...
ForkJoinPool forkJoinPool = new ForkJoinPool(4);
forkJoinPool.submit(()-> {
fileNames.parallelStream().forEach(fileName -> {
try(InputStream is = m_S3.downloadFile(fileName)) {
m_localDisk.createFile(fileName, is);
} catch (IOException e) {
e.printStackTrace();
}
});
}).get();

关于java - 在 Java 中并行化网络绑定(bind) for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44937484/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com