Tôi đang sử dụng chương trình để gửi dữ liệu từ cơ sở dữ liệu sang tệp Excel. Nó hoạt động tốt ở đầu và sau đó trở nên ngày càng chậm, cuối cùng nó chạy ra khỏi bộ nhớ và các lỗi sau đây ocurrs: "java.lang.OutOfMemoryError: Java heap space ...".Tại sao chương trình của tôi nhận được chậm hơn và chậm hơn?
Sự cố có thể được giải quyết bằng cách thêm jvm heap sapce.But câu hỏi là nó dành quá nhiều thời gian để chạy chương trình.
Sau vài phút, nó hoàn thành một vòng lặp với 4 giây có thể hoàn thành với 0,5 giây ngay từ đầu. Tôi không thể tìm thấy một giải pháp để làm cho nó luôn luôn chạy ở một tốc độ nhất định.
Có phải vấn đề về mã của tôi không?
Bất kỳ manh mối nào về điều này?
Đây là mã:
public void addAnswerRow(List<FinalUsers> finalUsersList,WritableWorkbook book){
if (finalUsersList.size() >0) {
try {
WritableSheet sheet = book.createSheet("Answer", 0);
int colCount = 0;
sheet.addCell(new Label(colCount++,0,"Number"));
sheet.addCell(new Label(colCount++,0,"SchoolNumber"));
sheet.addCell(new Label(colCount++,0,"District"));
sheet.addCell(new Label(colCount++,0,"SchoolName"));
sheet.setColumnView(1, 15);
sheet.setColumnView(3, 25);
List<Elements> elementsList = this.elementsManager.getObjectElementsByEduTypeAndQuestionnaireType(finalUsersList.get(0).getEducationType().getId(), this.getQuestionnaireByFinalUsersType(finalUsersList.get(0).getFinalUsersType().getId()));
Collections.sort(elementsList, new Comparator<Elements>(){
public int compare(Elements o1, Elements o2) {
for(int i=0; i< (o1.getItemNO().length()>o2.getItemNO().length()? o2.getItemNO().length(): o1.getItemNO().length());i++){
if (CommonFun.isNumberic(o1.getItemNO().substring(0, o1.getItemNO().length()>3? 4: o1.getItemNO().length()-1)) && !CommonFun.isNumberic(o2.getItemNO().substring(0, o2.getItemNO().length()>3? 4: o2.getItemNO().length()-1))){
return 1;
}
if (!CommonFun.isNumberic(o1.getItemNO().substring(0, o1.getItemNO().length()>3? 4: o1.getItemNO().length()-1)) && CommonFun.isNumberic(o2.getItemNO().substring(0,o2.getItemNO().length()>3? 4:o2.getItemNO().length()-1))){
return -1;
}
if (o1.getItemNO().charAt(i)!=o2.getItemNO().charAt(i)){
return o1.getItemNO().charAt(i)-o2.getItemNO().charAt(i);
}
}
return o1.getItemNO().length()> o2.getItemNO().length()? 1:-1;
}});
for (Elements elements : elementsList){
sheet.addCell(new Label(colCount++,0,this.getTitlePre(finalUsersList.get(0).getFinalUsersType().getId(), finalUsersList.get(0).getEducationType().getId())+elements.getItemNO()+elements.getItem().getStem()));
}
int sheetRowCount =1;
int sheetColCount =0;
for(FinalUsers finalUsers : finalUsersList){
sheetColCount =0;
sheet.addCell(new Label(sheetColCount++,sheetRowCount,String.valueOf(sheetRowCount)));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getSchoolNumber()));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getDistrict().getDistrictNumber().toString().trim()));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getName()));
List<AnswerLog> answerLogList = this.answerLogManager.getAnswerLogByFinalUsers(finalUsers.getId());
Map<String,String> answerMap = new HashMap<String,String>();
for(AnswerLog answerLog :answerLogList){
if (answerLog.getOptionsId() != null)
{
answerMap.put(answerLog.getElement().getItemNO(), this.getOptionsAnswer(answerLog.getOptionsId()));
}else if (answerLog.getBlanks()!= null){
answerMap.put(answerLog.getElement().getItemNO(), answerLog.getBlanks());
}else{
answerMap.put(answerLog.getElement().getItemNO(), answerLog.getSubjectiveItemContent());
}
}
for (Elements elements : elementsList){
sheet.addCell(new Label(sheetColCount++,sheetRowCount,null==answerMap.get(elements.getItemNO())?"0":answerMap.get(elements.getItemNO())));
}
sheetRowCount++;
}
book.write();
book.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}}
(Tiếp theo những nhận xét dưới đây) Bạn không cần phải giải thích nó một cách chi tiết .. Ví dụ, "Tôi lấy hai tờ mà cả hai đều có một chìa khóa thông thường (StudentID hoặc một cái gì đó ??) và tham gia cùng họ "hoặc một cái gì đó. Sau đó, chúng tôi có thể khuyên bạn sử dụng sắp xếp hợp nhất để sắp xếp các trang tính này trước tiên, bằng không gian đĩa và sau đó bạn có thể lặp qua cả hai trang tính mà không cần sử dụng bộ nhớ ... –