2015-10-28 4 views
0

Я работал с кодом, который работает с большим количеством данных, который сначала считывает целые длинные xlsx в arraylist arraylist, а затем в обработчике метода он работает по строкам и каждый раз, когда условие встретил, он пишет несколько столбцов и делает некоторые вещи (это может быть 1000 на рабочий метод), поэтому он пишет 1 строку на одного работника. метод Worker реализуется МНОГО раз, таким образом, окончательный XLSX будет, скажем, 100000 строк, все 1000 строк (надеюсь, еще позже.):java apache poi loop performance

public static void main(String[] args) throws Throwable { 
ArrayList<ArrayList> data; //filled by many thousands of rows from xlsx table in other part of code 
SXSSFWorkbook workbook = new SXSSFWorkbook(100); 
Sheet sheet = workbook.createSheet("sheet1"); 
FileOutputStream outputStream = new FileOutputStream("D:/output.xlsx"); 
int rowCount = 0; 
Row row = sheet.createRow(0); 

    for (int i = 1, 1 < 100000, i++){ 
    row = sheet.createRow(i); 
    worker(data,sheet,workbook,row) 
    } 

workbook.write(outputStream); 
outputStream.close(); 
workbook.dispose(); 

}  

public static Row worker (ArrayList<ArrayList> data,Sheet sheet, SXSSFWorkbook workbook, Row row){ 

    int columnCount = 0; 

     for (int i = 0; i < data.get(0).size(); i++) { //loop line by line through whole table 
      if (data.get(1).get(i) meets some condition){ 
      Cell cell = row.createCell(++columnCount); 
      cell.setCellValue("column number" + columnCount); 
      do some other stuff; 
      } 
     } 
return row; 
    } 

Что такое узкое место в таком роде вычисления? Он работает намного быстрее на моем более высоком первичном ПК, чем nb, но я также пытался запустить его на сервере 8core 28gb ram xeon (выиграть в 2012 году), где все было недостаточно использовано, но улучшения в моем доме не было (если есть) ПК. Как сделать эту небольшую программу быстрее? Работайте с db вместо arraylist arraylist? Сделать так, чтобы вычислить параллельно? - любой указатель здесь, какая часть для параллелизма. У вас нет других идей, так как я любитель учится на лету notaprogramer:/

Спасибо за любой вклад.

+0

Вы пробовали профилировать свой код? Где все время фактически тратится? – Gagravarr

+0

Нет, я этого не делал. Любой хороший бесплатный профайлер? Насколько это возможно, у меня нет опыта с ними. Но в целом рабочий метод должен проходить через весь массив и снова несколько сотен раз во втором цикле через его часть. для этого требуется, возможно, 0,5 секунды, но, как я должен делать это 100000 или более раз, все это занимает некоторое время, а поскольку вычислительные ресурсы не полностью используются, я думаю, что какой-то паралич был бы более прямым apraach и сокращает время значительно больше, чем возиться с самим работником. – user3338991

ответ

1

Поскольку вы не используете несколько потоков, используется только одно ядро ​​процессора. Таким образом, несколько ядер или больше памяти не улучшаются значительно, имеет значение только голова CPU, и это кажется сопоставимым между двумя системами.

Вы можете попытаться сделать эту работу параллельно, но обратите внимание, что POI сам по себе не гарантирует безопасность потока, поэтому вы немного наступаете на тонкий лед. Возможно, вы сможете создать все строки вперед, а затем заполнить ячейки параллельно.

Другой вариант - попытаться использовать что-то вроде streaming XLSX reader для обработки файла во время его чтения, но затем вы должны записать данные в новый файл (возможно, используя SXSSFWorkbook, чтобы также не потреблять всю память), как в написать письмо невозможно.