Я работаю над приложением 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
Программисты JAVA общаются здесь
1738063822
Anonymous
Я работаю над приложением 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 более эффективным.
Подробнее здесь: [url]https://stackoverflow.com/questions/79393633/how-to-optimize-memory-usage-when-processing-large-encrypted-excel-files-in-java[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия