2014-12-15 2 views
0

나는이점점 예외 "주요"java.lang.OutOfMemoryError와 : Java 힙 공간

java.lang.OutOfMemoryError: Java heap space. 

가 완전히 내가 40 개 엑셀 파일이 각 파일 월 내가 점점 폴더에 5 개 이상의 엑셀 파일을 넣을 경우 5 ~ 10 장이 들어 있습니다. 내 코드는 Excel 파일의 오류를 찾아서 Error.txt 파일에 기록합니다.

public class Hvd { 

    public static int getExcelColumnNumber(String column) { 
     int result = 0; 
     for (int i = 0; i < column.length(); i++) { 
      result *= 26; 
      result += column.charAt(i) - 'A' + 1; 
     } 
     return result; 
    } 

    public static String getExcelColumnName(int number) { 
     final StringBuilder sb = new StringBuilder(); 

     int num = number - 1; 
     while (num >= 0) { 
      int numChar = (num % 26) + 65; 
      sb.append((char)numChar); 
      num = (num/26) - 1; 
     } 
     return sb.reverse().toString(); 
    } 


    public static void main(String[] args) { 
     try { 

      //File directory = new File("C://Users//zkuwscr//Documents//new practice tests//Regression_Dev_Dec12th"); 
      File directory = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets"); 
      File[] files = directory.listFiles(); 

      //File errorBW = new File("C://Users//zkuwscr//Documents//new practice tests//Regression_Dev_Dec12th//ErrorBW.txt"); 
      File errors = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//Error.txt"); 
      FileOutputStream errorsFileOutputStream = new FileOutputStream(errors); 
      BufferedWriter errorsBufferedWriter = new BufferedWriter(new OutputStreamWriter(errorsFileOutputStream)); 

      File mismatch = new File("C://Users//kondeti.venkatarao//Documents//Regresion_sheets//Mismatch.txt"); 
      FileOutputStream mismatchFileOutputStream = new FileOutputStream(mismatch); 
      BufferedWriter mismatchBufferedWriter = new BufferedWriter(new OutputStreamWriter(mismatchFileOutputStream)); 


      for (File file : files) { 
       if (file.getName().endsWith(".xlsx")) { 
        //FileInputStream fis = new FileInputStream(file); 
        // Create Workbook instance holding reference to .xlsx file 

        OPCPackage pkg = OPCPackage.open(file); 
        XSSFWorkbook workbook = new XSSFWorkbook(pkg); 
        int i = 1; 
        while (i < workbook.getNumberOfSheets()) { 

         // System.out.println(workbook.getNumberOfSheets()); 
         // Get first/desired sheet from the workbook 
         XSSFSheet sheet = workbook.getSheetAt(i); 

         // Iterate through each rows one by one 
         Iterator<Row> rowIterator = sheet.iterator(); 
         while (rowIterator.hasNext()) { 
          Row row = rowIterator.next(); 
          // For each row, iterate through all the columns 
          Iterator<Cell> cellIterator = row.cellIterator(); 
          while (cellIterator.hasNext()) { 
           Cell cell = cellIterator.next(); 
           // Check the cell type and format accordingly 
           switch (cell.getCellType()) { 
           /* 
           * case Cell.CELL_TYPE_NUMERIC: 
           * System.out.print(cell.getNumericCellValue()); 
           * break; case Cell.CELL_TYPE_STRING: 
           * System.out.print(cell.getStringCellValue()); 
           * break; 
           */ 
           // case Cell.CELL_TYPE_FORMULA: 
           case Cell.CELL_TYPE_FORMULA: 

            if (cell.getCellFormula().startsWith("IF(")) 
             if (sheet.getRow(row.getRowNum()) 
               .getCell(cell.getColumnIndex()) 
               .getRawValue().equals("1")) { 

              HashSet<Integer> number= new HashSet<Integer>(); 
              ArrayList<String> alphas=new ArrayList<String>(); 

              String formula=sheet.getRow(row.getRowNum()).getCell(cell.getColumnIndex()).toString(); 
              Matcher digitMatcher = Pattern.compile("\\d+").matcher(formula); 
              Matcher alphabetMatcher = Pattern.compile("[a-zA-Z]+").matcher(formula); 

              while(alphabetMatcher.find()) { 
               if(!alphabetMatcher.group().equals("TYPE")) 
                alphas.add(alphabetMatcher.group()); 
              } 

              int countIF = Collections.frequency(alphas, "IF"); 
              int countABS = Collections.frequency(alphas, "ABS"); 
              HashSet<String> alphaSet=new HashSet<String>(alphas); 
              if(countIF!=5 && countIF!=6) 
               alphaSet.remove("IF"); 
              if(countABS != 3 && countABS!=4) 
               alphaSet.remove("ABS"); 

              while(digitMatcher.find()) { 
               if(!digitMatcher.group().equals("0") && !digitMatcher.group().equals("1") && !digitMatcher.group().equals("01")) 
               number.add(Integer.parseInt(digitMatcher.group())); 
              } 


              ArrayList<Integer> numberList = new ArrayList<Integer>(number); 
              ArrayList<String> alphaList = new ArrayList<String>(alphaSet); 
              System.out.println("alphaSet"+alphaSet); 
              System.out.println("numberList"+numberList); 

              int rowIndex=numberList.get(0)-1; 
              int originalColumnIndex = getExcelColumnNumber(alphaList.get(0))-1; 
              int referenceColumnIndex = getExcelColumnNumber(alphaList.get(1))-1; 
              if(originalColumnIndex > referenceColumnIndex){ 
               int temp = referenceColumnIndex; 
               referenceColumnIndex =originalColumnIndex; 
               originalColumnIndex=temp; 
              } 


              //System.out.println(sheet.getRow(row.getRowNum())); 
              System.out.println("File Name: "+ file.getName()); 
              System.out.println("Sheet Name: "+ sheet.getSheetName()); 
              System.out.println(sheet.getRow(row.getRowNum()).getCell(cell.getColumnIndex()).toString()); 
              if(sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula().equals("")) 
               System.out.println("please help me out"); 
              System.out.println("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula()); 
              System.out.println("row indext"+rowIndex); 
              System.out.println("original column index"+originalColumnIndex); 
              System.out.println("ref column index"+referenceColumnIndex); 
              /*System.out.println("File Name: " 
                + file.getName()); 
              System.out.println("Sheet Name: " 
                + sheet.getSheetName()); 
              System.out.println(cell 
                .getCellFormula());*/ 
              if(sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula().contains("qCRA_") && sheet.getRow(rowIndex).getCell(originalColumnIndex).getRawValue().contains("Error:")){ 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("File Name: "+ file.getName()); 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("Sheet Name: "+ sheet.getSheetName()); 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula()); 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("Cell Number: "+getExcelColumnName(originalColumnIndex+1)+numberList.get(0)); 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("Orginal Value : "+sheet.getRow(rowIndex).getCell(originalColumnIndex).getRawValue()); 
               errorsBufferedWriter.newLine(); 
               errorsBufferedWriter.write("Reference Value : "+sheet.getRow(rowIndex).getCell(referenceColumnIndex)); 
               errorsBufferedWriter.newLine(); 
              } else { 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("File Name: "+ file.getName()); 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("Sheet Name: "+ sheet.getSheetName()); 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("Function Name: "+ sheet.getRow(rowIndex).getCell(originalColumnIndex).getCellFormula()); 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("Cell Number: "+getExcelColumnName(originalColumnIndex+1)+numberList.get(0)); 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("Orginal Value : "+sheet.getRow(rowIndex).getCell(originalColumnIndex).getRawValue()); 
               mismatchBufferedWriter.newLine(); 
               mismatchBufferedWriter.write("Reference Value : "+sheet.getRow(rowIndex).getCell(referenceColumnIndex)); 
               mismatchBufferedWriter.newLine(); 
              } 
             } 
            break; 

           } 
           cell=null; 
          } 
          row=null; 
         } 
         i++; 
         //fis.close(); 
         pkg.close(); 
         sheet=null; 
        } 
        workbook=null; 
       } 
      } 
      errorsBufferedWriter.close(); 
      errorsFileOutputStream.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

StringBuffer를 사용하지 마십시오. StringBuilder는 10 년 동안 대체되었습니다. –

+1

슬래시를 이스케이프 할 필요가 없습니다. 단지'c :/Users/'를 사용하십시오. –

+0

이 질문의 답을 따르려고 했습니까? http://stackoverflow.com/questions/2381849/exception-in-thread-main -java-lang-outofmemoryerror-java-heap-space? – reto

답변

1
  1. 당신은 OOM을받을 경우 , -Xmx를 사용하여 ... 힙 크기를 증가 할 수 있습니다.
  2. StringBuffers를 버리고 파일 (BufferedWriter 또는 PrintStream)에 직접 쓸 수 있습니다. 모든 출력을 메모리에 보관할 필요가 없습니다. 이것만으로도 문제가 해결 될 수 있습니다.
+0

이제는 BufferedWriter를 사용했지만 여전히 사용 중임 스레드 "main"의 예외 java.lang.OutOfMemoryError : Java 힙 공간. 나는 StringBuffer/StringBuilder를 완전히 제거했다. –

+0

질문에서 코드를 업데이트하십시오. – Axel

+0

Axel @Axel 새로운 코드로 질문을 업데이트했습니다. –