Здравствуйте. Проблема в прочтении excel файла размером 25 Мб в 10 000 строк, а затем записи в другой файл распаршенной информации. Использую библиотеку org.apache.poi версии 3.9. Выполняется программа около 3-4 часов, а если строк больше, то вообще падает OutOfMemory, наверняка, делаю что-то неправильно. Код |
public void parse(String inputFileName) throws IOException { HSSFWorkbook wb; NPOIFSFileSystem fs = null;
try { // HSSFWorkbook, File fs = new NPOIFSFileSystem(new File(inputFileName)); wb = new HSSFWorkbook(fs.getRoot(), false);
Sheet sheet = wb.getSheetAt(0); Iterator<Row> it = sheet.iterator(); while (it.hasNext()) { Row row = it.next(); Iterator<Cell> cells = row.iterator(); Cell cell = cells.next();//actual_person_version_id //манипуляции с инфой в ячейках fillFields(...); } } catch (IOException e) { e.printStackTrace(); fs.close(); } fs.close(); System.out.println("Done."); }
private void fillFields(String text, String profileId, String source) throws IOException { Map<Long, Object[]> data = new TreeMap<Long, Object[]>(); data.put(rowCount, new Object[]{profileId, profileId, source, text}); write(data, profileId); }
private void write(Map<Long, Object[]> data, String profileId) throws IOException { HSSFWorkbook workbook; NPOIFSFileSystem fs = null; try { fs = new NPOIFSFileSystem(new File("result.xls")); workbook = new HSSFWorkbook();
//Create a blank sheet HSSFSheet sheet = workbook.getSheet(0);
//Iterate over data and write to sheet Set<Long> keyset = data.keySet(); for (Long key : keyset) { Row row = sheet.createRow(rowCount.intValue()); Object[] objArr = data.get(key); int cellnum = 0; for (Object obj : objArr) { Cell cell = row.createCell(cellnum++); if (obj instanceof String) cell.setCellValue((String) obj); else if (obj instanceof Integer) cell.setCellValue((Integer) obj); } } writeData(workbook, profileId); fs.close(); } catch (IOException e) { e.printStackTrace(); } }
private void writeData(HSSFWorkbook workbook, String profileId) { FileOutputStream out=null; try { //Write the workbook in file system out = new FileOutputStream(new File("result.xls")); workbook.write(out); out.close();
} catch (Exception e) { e.printStackTrace(); } }
|
Можно ли как-то сократить время выполнения? И избавиться от outOfMemory?
|