Как скопировать большое количество файлов из папки S3 в другую - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь переместить большое количество файлов (максимальный размер каждого файла около 300 КБ) из папки S3 в другую.

Я использую AWS SDK для Java и попытался переместить около 1500 файлов.

это заняло слишком много времени, и количество файлов может увеличиться до 10000.

для каждой копии файла, необходимо удалить из исходной папки, так как нет способа переместить файл.

это то, что я пробовал:

public void moveFiles(String fromKey, String toKey) {
    Stream<S3ObjectSummary> objectSummeriesStream = this.getObjectSummeries(fromKey);
    objectSummeriesStream.forEach(file ->
        {
            this.s3Bean.copyObject(bucketName, file.getKey(), bucketName, toKey);
            this.s3Bean.deleteObject(bucketName, file.getKey());
        });

}

private Stream<S3ObjectSummary> getObjectSummeries(String key) {

    // get the files that their prefix is "key" (can be consider as Folders).
    ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName(this.bucketName)
        .withPrefix(key);
    ObjectListing outFilesList = this.s3Bean.listObjects(listObjectsRequest);
    return outFilesList.getObjectSummaries()
        .stream()
        .filter(x -> !x.getKey()
            .equals(key));
}

1 Ответ

0 голосов
/ 22 мая 2019

Если вы используете приложение Java, вы можете попробовать использовать несколько потоков для копирования файлов:

private ExecutorService executorService = Executors.fixed(20);

public void moveFiles(String fromKey, String toKey) {
    Stream<S3ObjectSummary> objectSummeriesStream = 
    this.getObjectSummeries(fromKey);
    objectSummeriesStream.forEach(file ->
    {
        executorService.submit(() ->
            this.s3Bean.copyObject(bucketName, file.getKey(), bucketName, toKey);
            this.s3Bean.deleteObject(bucketName, file.getKey());
        )};
    });

}

Это должно ускорить процесс.

Альтернативой может быть использование AWS-лямбды.Как только файл появится в исходной корзине, вы можете, например, поместить событие в очередь SQS FIFO.К этому событию лямбда начнет копировать один файл.Если я не ошибаюсь параллельно, вы можете запустить до 500 экземпляров лямбд.Должно быть быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...