Это своего рода встроенный w/Запись большого ResultSet в файл, но этот файл является файлом Excel.
Я использую библиотеку POI Apache для записи файла Excel с большим набором данных, полученным из объекта ResultSet. Данные могут варьироваться от нескольких тысяч записей до примерно 1 миллиона; не уверен, как это переводится в байты файловой системы в формате Excel.
Ниже приведен тестовый код, который я написал, чтобы проверить время, затрачиваемое на создание такого большого набора результатов, а также импликации производительности w.r.t CPU и Memory.
protected void writeResultsetToExcelFile(ResultSet rs, int numSheets, String fileNameAndPath) throws Exception {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileNameAndPath));
int numColumns = rs.getMetaData().getColumnCount();
Workbook wb = ExcelFileUtil.createExcelWorkBook(true, numSheets);
Row heading = wb.getSheetAt(0).createRow(1);
ResultSetMetaData rsmd = rs.getMetaData();
for(int x = 0; x < numColumns; x++) {
Cell cell = heading.createCell(x+1);
cell.setCellValue(rsmd.getColumnLabel(x+1));
}
int rowNumber = 2;
int sheetNumber = 0;
while(rs.next()) {
if(rowNumber == 65001) {
log("Sheet " + sheetNumber + "written; moving onto to sheet " + (sheetNumber + 1));
sheetNumber++;
rowNumber = 2;
}
Row row = wb.getSheetAt(sheetNumber).createRow(rowNumber);
for(int y = 0; y < numColumns; y++) {
row.createCell(y+1).setCellValue(rs.getString(y+1));
wb.write(bos);
}
rowNumber++;
}
//wb.write(bos);
bos.close();
}
Не повезло с вышеуказанным кодом. Создаваемый файл, похоже, быстро растет (~ 70 Мб/сек). Поэтому я остановил выполнение примерно через 10 минут (убил JVM, когда файл достиг 7Gb) и попытался открыть файл в Excel 2007. В тот момент, когда я его открываю, размер файла становится 8k (!), И только заголовок и первый строка создается. Не уверен, что мне здесь не хватает.
Любые идеи?