使用 Java 批量上传到 Box*
Bulk Upload to Box* using Java
我在将文件上传到 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 不熟悉,但快速检查发现它确实为 large file uploads 使用了线程池,所以这样的事情应该是可能的:
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
我在将文件上传到 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 不熟悉,但快速检查发现它确实为 large file uploads 使用了线程池,所以这样的事情应该是可能的:
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