Массовая загрузка в Box * с использованием Java - PullRequest
0 голосов
/ 12 января 2019

При загрузке файлов в 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 и т. Д.

Дайте мне знать, если это сбивает с толку. Я могу объяснить дальше. Спасибо!

1 Ответ

0 голосов
/ 13 января 2019

Я бы попытался загрузить изображения параллельно. Передача через Интернет работает лучше при использовании нескольких параллельных соединений.

Я не знаком с 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
...