java - 使用 Java 批量上传到 Box*
问题描述
在将文件上传到 Box 时,我遇到了一些性能问题。我需要上传大约 50000 张图片。我怀疑这可能是因为我正在一一上传它们。因此,我想到了尝试批量上传来上传。以下是我的代码片段:
List<String> filesToUpload = new ArrayList<String>();
public boolean processImage(File imageToProcess, String newName, String temp_location, String boxLocation) throws MagickException {
File renamedImage = renameImage(newName, temp_location);
boolean isProcessed = convertToPNG(imageToProcess,
renamedImage);
String filePath = renamedImage.getPath();
System.out.println("Processed Image: "+filePath);
if (log.isInfoEnabled()) {
log.info("processEntries - filePath " + filePath);
}
filesToUpload.add(filePath);
if (filesToUpload.size() == 100) {
UploadFileAsAppUser.uploadFilesAsBoxAppUser(filesToUpload, boxLocation);
filesToUpload = new ArrayList<String>();
}
return isProcessed;
}
我没有测试过。如果列表大小为 100,它将开始将图像上传到 Box,但它也会停止在同一侧生成图像。
我可以创建两个线程。一个将生成图像,另一个将上传图像。但是在我的上传图片块中,我还将列表设置为空,一旦上传了所有 100 张图片,就会发生这种情况。但是,如果我等待所有 100 个图像都上传完毕,然后开始生成下一组图像(因为我正在清除列表并将其初始化为空),那么拥有多个线程是没有用的。
我应该有两个列表吗?Thread1 将生成前 100 张图像。完成后,Thread2 将开始上传,同时第一个线程将开始生成另一组图像到列表 2,依此类推..
让我知道它是否令人困惑。我可以进一步解释。谢谢!
解决方案
我会尝试并行上传图像。使用多个并行连接时,通过 Internet 进行的传输效果更好。
我不熟悉 Box API,但快速检查发现它确实使用线程池进行大文件上传,所以应该可以这样:
final int numberOfParallelUploads = 5;
ExecutorService pool = Executors.newFixedThreadPool(numberOfParallelUploads);
final BoxFolder boxFolder = BoxFolder.getRootFolder(boxApi);
for (/* each input file */) {
final String fileName = /* get next file to upload */;
pool.execute(() -> {
try (InputStream is = new FileInputStream(fileName)) {
boxFolder.uploadFile(is, fileName);
}
});
}
pool.shutdown();
pool.awaitTermination(2, TimeUnit.HOURS); // absolute timeout for uploading all the files
推荐阅读
- c# - 如何读取内存中的 csv 文件以进行快速处理?
- java - 如何在 java gradle 构建中包含自定义 .jar 文件?
- javascript - 如何在js中拆分不同长度的字符串?
- c - 在堆栈上构造保持上次函数调用的先前值
- android - 如何解决颤振中的 build.gradle 错误。如何解决此错误“评估项目 ':app' 时出现问题。> 格式错误的 \uxxxx 编码。”
- python - 程序在 Pycharm 调试器中崩溃,但不是在常规 Pycharm 运行中
- ios - 过滤领域的查询
- html - html 网站在不同的分辨率(如 mac 等)上重叠和混乱
- python - discord.py : bot.wait_for() 拦截 message.add_reaction() 并工作一次
- python - 使用没有嵌入的 LSTM 层