Я работал с кодом, который работает с большим количеством данных, который сначала считывает целые длинные 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:/
Спасибо за любой вклад.
Вы пробовали профилировать свой код? Где все время фактически тратится? – Gagravarr
Нет, я этого не делал. Любой хороший бесплатный профайлер? Насколько это возможно, у меня нет опыта с ними. Но в целом рабочий метод должен проходить через весь массив и снова несколько сотен раз во втором цикле через его часть. для этого требуется, возможно, 0,5 секунды, но, как я должен делать это 100000 или более раз, все это занимает некоторое время, а поскольку вычислительные ресурсы не полностью используются, я думаю, что какой-то паралич был бы более прямым apraach и сокращает время значительно больше, чем возиться с самим работником. – user3338991