首页 > 解决方案 > 使用 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,依此类推..

让我知道它是否令人困惑。我可以进一步解释。谢谢!

标签: javamultithreadingperformanceparallel-processingbox-api

解决方案


我会尝试并行上传图像。使用多个并行连接时,通过 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

推荐阅读