Я работаю над приложением Java Patch, которое обрабатывает большие зашифрованные файлы Excel. Процесс включает в себя: < /p>
[*] Извлечение зашифрованного файла Excel из ведра GCS. < /P>
< /li>
расшифровывает файл с помощью pgp.
[*] Разбор файла и извлечение данных в список объектов использования.
< /li>
Извлечение объектов employerErresponse для каждого запроса. < /p>
< /li>
Создание Новый файл Excel с данными ответа.
[*] шифрование файла ответа с помощью pgp.
Загрузка зашифрованного файла обратно в ведро GCS. Я ищу способы оптимизировать потребление памяти и сделать процесс более эффективным. < /P>
//... other methods...
public List parseInputFileAndReturnEmployerRequests(byte fileContent) throws IOException {
List requests = new ArrayList();
try (InputStream inputStream = new ByteArrayInputStream(fileContent)) {
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(Integer.parseInt(inputSheetNumber));
Iterator rowIterator = sheet.iterator();
if (rowIterator.hasNext()) {
rowIterator.next();
}
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
// Assuming EmployerServiceHelper.createEmployerRequest exists
requests.add(employerServiceHelper.createEmployerRequest(row));
}
}
return requests;
}
//... other methods...
public void process(String fileName) throws IOException, RestException {
outputFileName = FileHelper.getOutputFileName(fileName);
byte fileContent = storageService.getInputFile(fileName);
ByteArrayOutputStream decryptOutputStream = pgpService.pgpDecrypt(fileContent);
final List requests = parseInputFileAndReturnEmployerRequests(decryptOutputStream.toByteArray());
final List responses = employerServiceHelper
.fetchEmployerResponses(requests, FileHelper.getMemberIdFromFileName(fileName));
//... rest of the code...
}
< /code>
< /li>
< /ul>
Я использую следующие зависимости: < /p>
apache poi: for Manipulation Excel (poi-ooxml) и
Google Cloud Storage: для хранения файлов (Google-Cloud-Storage) < /p>
Я пробовал упомянутые решения из нескольких ответов Stackoverflow. Один фрагмент кода, который я был уверен, работал бы: < /p>
public void process(String fileName) throws IOException, RestException {
String outputFileName = FileHelper.getOutputFileName(fileName);
byte[] fileContent = storageService.getInputFile(fileName);
ByteArrayOutputStream decryptOutputStream = pgpService.pgpDecrypt(fileContent);
try (decryptOutputStream) {
final List requests = parseInputFileAndReturnEmployerRequests(decryptOutputStream.toByteArray());
final List responses = employerServiceHelper
.fetchEmployerResponses(requests, FileHelper.getMemberIdFromFileName(fileName));
createEncryptedResponseFileAndUploadToGCS(
responses,
EmployerServiceHelper.getMaxIncomeInformationSize(responses),
EmployerServiceHelper.getMaxGrossIncomeInformationSize(responses),
EmployerServiceHelper.getSuperAnnuationSize(responses));
}
}
public List parseInputFileAndReturnEmployerRequests(byte[] fileContent)
throws IOException {
List requests = new ArrayList();
try (InputStream inputStream = new ByteArrayInputStream(fileContent);
Workbook workbook = new XSSFWorkbook(inputStream)) {
Sheet sheet = workbook.getSheetAt(Integer.parseInt(inputSheetNumber));
Iterator rowIterator = sheet.iterator();
if (rowIterator.hasNext()) {
rowIterator.next();
}
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
EmployerRequest request = new EmployerRequest();
employerServiceHelper.updateEmployerRequest(request, row);
requests.add(request);
}
}
return requests;
}
< /code>
Однако я получаю следующую ошибку: < /p>
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:95)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65)
Caused by: org.apache.poi.openxml4j.exceptions.NotOfficeXmlFileException: No valid entries or contents found, this is not a valid OOXML (Office Open XML) file
at org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:159)
at org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.(ZipInputStreamZipEntrySource.java:94)
at org.apache.poi.openxml4j.opc.ZipPackage.(ZipPackage.java:133)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:319)
at org.apache.poi.ooxml.util.PackageHelper.open(PackageHelper.java:59)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:290)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.(XSSFWorkbook.java:286)
at com.some-company.ews.iws.employer.batch.employerorderbatch.service.FileProcessor.parseInputFileAndReturnEmployerRequests(FileProcessor.java:88)
at com.some-company.ews.iws.employer.batch.employerorderbatch.service.FileProcessor.process(FileProcessor.java:64)
at com.some-company.ews.iws.employer.batch.employerorderbatch.EmployerOrderBatchApplication.main(EmployerOrderBatchApplication.java:41)
... 8 more
Caused by: java.util.zip.ZipException: Unexpected record signature: 0x30c0185
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextZipEntry(ZipArchiveInputStream.java:761)
at org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:150)
... 17 more
< /code>
Как я могу оптимизировать этот код, чтобы уменьшить использование памяти, особенно при работе с большими файлами Excel? < /p>
Дополнительные данные:
i ' M открывается для использования любых библиотек или методов, которые могут помочь с оптимизацией памяти.
файлы Excel могут быть очень большими (сотни MBS или даже GBS). Количество строк в файле Excel может быть значительным. < /P>
Пожалуйста, обратите внимание: < /p>
Я пропустил некоторые данные для краткости, но я могу предоставить больше информации, если это необходимо.
Я специально ищу методы оптимизации памяти, а не только общие улучшения кода. Я хочу услышать ваши предложения и узнать, как сделать мое приложение Java Patch более эффективным.
Подробнее здесь: https://stackoverflow.com/questions/793 ... es-in-java
Как оптимизировать использование памяти при обработке больших зашифрованных файлов Excel в Java? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение