Java - читать, обрабатывать, писать с большим Excel - PullRequest
0 голосов
/ 09 декабря 2018

У меня большой лист.Он имеет 10 листов, каждый с 1 м строк.С Java мне нужно запустить алгоритм для каждой строки, вернуть значение для каждой строки и вставить обратно в файл Excel.

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

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

Я попытался увеличить кучу в run-> run configurations-> arguments и в панели управления-> java.Это не сработало.

Я попытался использовать следующий StreamingReader, и он не сработал.

FileInputStream in = new FileInputStream("D:\\work\\calculatepi\\sampleresult.xlsx");
Workbook workbook = StreamingReader.builder()
    .rowCacheSize(100)  
    .bufferSize(4096)  
    .open(in);  

Я действительно не в курсе и не уверен, что делать.Нет ли простого способа сделать это?

1 Ответ

0 голосов
/ 09 декабря 2018

Речь идет не только о конфигурации этой библиотеки.Это также касается памяти, которую вы дарите JVM!Попробуйте увеличить пространство кучи JVM, см., Например, здесь .

Кроме того: я думаю, что вы должны сделать две вещи:

  • провести эксперименты с меньше листов.Создайте тот, который имеет только 100 строк, затем, может быть, 10K, 100K.Измерьте потребление памяти.И оттуда
  • посмотрите, есть ли другие API / библиотеки, которые позволяют вам читать / записывать отдельные строки без вытягивания всего файла в память
  • и если ничего из этогоработает, может быть, вам придется использовать совершенно другой дизайн: например, просто иметь какое-то «обслуживание».А теперь вы пишете некоторый код VB-скрипта, который вы запускаете внутри Excel, который просто для каждой строки вызывает эту службу для получения результатов.Или, в идеале: не используйте Excel в качестве базы данных.Это похоже на использование спортивного автомобиля для перевозки огромного количества товаров только потому, что у вас уже есть этот спортивный автомобиль.Но все же было бы более уместным, чтобы вместо этого получить себе грузовик.Другими словами: рассмотрите возможность перемещения ваших данных в реальную базу данных.В конечном итоге все, что вы будете делать, будет «легче»!
...