Как лучше всего получить файлы из AWS S3, вставить их в zip-архив и загрузить этот zip-архив в корзину?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как лучше всего получить файлы из AWS S3, вставить их в zip-архив и загрузить этот zip-архив в корзину?

Сообщение Anonymous »

Я пытаюсь найти эффективный способ загрузки файлов из s3, вставить их в zip-файл, а после вставки этих файлов в архив загрузить его в корзину. Это должно быть эффективно, поскольку размер архива может достигать почти 10 ГБ. Я попытался использовать один поток с библиотекой ZipOutputStream от Zip4J, созданной из PipedOutputStream, для вставки файлов в zip и одновременного использования другого потока для загрузки этого zip-архива в корзину. Проблема в том, что zip-архив поврежден, и я не могу скопировать ни один файл из этого zip-архива. Вот мой код:
Часть, которая загружает и вставляет файлы в zip-архив:

Код: Выделить всё

private Thread getDownloadAndZipThread(List keys, String filename, ZipFile zip, ZipParameters parameters) {
return new Thread(() -> {
long start = System.currentTimeMillis();
try (final ZipOutputStream zipOutputStream = new ZipOutputStream(pipedOutputStream)){
keys.forEach(key -> {
//logger.log("\nprocessing file: " + key);
try {
parameters.setFileNameInZip(key);
zipOutputStream.putNextEntry(parameters);
pipedOutputStream.write(s3Service.getFile(key,               BUCKET_NAME).readAllBytes());
zipOutputStream.closeEntry();
//zip.addStream(IOUtils.copy(s3Service.getFile(key, BUCKET_NAME),  pipedOutputStream), parameters);
} catch (IOException e) {
throw new RuntimeException(e);
}
});
} catch (Exception e) {
logger.log("\nZipService - getDownloadAndZipThread - error: " + e);
}
long executedTime = System.currentTimeMillis() - start;
logger.log("\nZipService - getDownloadAndZipThread - execution time: " + executedTime);
});
}
Часть, загружающая zip-архив в корзину:

Код: Выделить всё

private Thread getS3Out(String filename) {
return new Thread(() -> {
long start = System.currentTimeMillis();
try {
s3Service.multipartUpload(filename, BUCKET_NAME, pipedInputStream);
pipedInputStream.close();
} catch (final Exception all) {
logger.log("\nFailed to process outputStream due to error: " + all + "\n");
System.exit(-3);
}
long executedTime = System.currentTimeMillis() - start;
logger.log("\nZipService - getS3Out - execution time: " + executedTime);
});
}
Часть, вызывающая эти потоки:

Код: Выделить всё

String filename = generateZipName();
ZipFile zip = new ZipFile(filename);

ZipParameters parameters = new ZipParameters();
parameters.setCompressionLevel(CompressionLevel.FASTEST);

final Thread downloadAndZip = getDownloadAndZipThread(keys, filename, zip, parameters);
final Thread upload = getS3Out(filename);

downloadAndZip.start();
upload.start();
try {
downloadAndZip.join();
upload.join();
} catch (InterruptedException e) {
logger.log("ZipService - failed to join thread due to error: " + e);
throw new RuntimeException(e);
}
Я пробовал использовать встроенный поток Java ZipOutput, но он работает слишком медленно, и, поскольку мне нужно использовать этот код в лямбда-выражении AWS, он должен быть лучше. Загрузка — вставка в zip — загрузка в корзину занимает 130 секунд.
Zip4J ZipOutputStream вместо этого занимает 80 секунд в том же цикле.
Оба варианта были протестированы на 16 файлах общим размером 1,6 ГБ.
Мне нужно как-то исправить проблему с поврежденным zip-файлом для случая Zip4j.

Подробнее здесь: https://stackoverflow.com/questions/752 ... -zip-and-u
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»