2013-05-26 1 views
0

내 프로그램은 큰 텍스트 파일 (45MB)을 사용하여 작동하며 잘 실행됩니다. 항아리로 내 보낸 후에는 큰 소스 파일에 액세스 할 때 제대로 작동하지 않습니다. 작은 파일 (300kB)에는 아무런 문제가 없습니다.내 JAR은 일식으로 실행될 때와 같이 작동하지 않습니다.

Eclipse : 10 초 동안 정지 한 다음로드 된 파일이 준비되었습니다.

용기 : 5 초 동안 정지되고 아무 일도 일어나지 않습니다.

제대로 작동하려면 JAR을 어떻게 변경할 수 있습니까?

편집 :

public String [] RetreiveTokens(){ 
    String path = Main_Win.class.getProtectionDomain().getCodeSource().getLocation().getPath(); 
    String decodedPath = null; 
    try { 
     decodedPath = URLDecoder.decode(path, "UTF-8"); 
    } catch (UnsupportedEncodingException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 

    String FileName=decodedPath+"languages/D3.txt";//LangPath+SourceFileLists.get(i); 

    String content = null; 
    boolean DictCC = false; 
    int ContentsAddress=0; 
    try { 

     BufferedReader fin; 

     String lineFromFile=""; 
     try { 
      fin = new BufferedReader(new FileReader(FileName)); 
      //System.out.println("cc"); 
      lineFromFile = fin.readLine(); 
      lineFromFile=lineFromFile.substring(3); 
      if(lineFromFile.substring(0,1).equals("#")){ 
       DictCC=true; 
       for(ContentsAddress=0; fin.readLine().length()>0; ContentsAddress++); 
       ContentsAddress+=2; 
       //System.out.println(ContentsAddress); 
      } 
      fin.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     //System.out.println(lineFromFile); 
     //if(!DictCC){ 
     content = new Scanner (new File (FileName), "UTF-8").useDelimiter("\\Z").next(); 
     //} 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    String[] tokens=null; 
    //String[][] Words_1=new String[2][32];; 

    if(!DictCC){ 
     content=content.substring(1); 
     content=content.replace("\r\n\r\n", "\r\n"); 
     tokens = content.split("\r\n"); 
    } 
    else { 
     content = content.split("\r\n")[ContentsAddress]; 
     tokens = content.split(" "); 
    } 

    for (int t=0; t<tokens.length; t++){ 
     if(tokens[t].contains("\n")){ 
      int index = nthOccurrence(tokens[t], '\n', 0); 
      tokens[t]=tokens[t].substring(index); 
     } 
     if(tokens[t].contains("[")){ 
      tokens[t]=tokens[t].replace(" [", "["); 
      tokens[t]=tokens[t].replace("] ", "]"); 
      tokens[t]=tokens[t].replaceAll("\\[.*\\]", ""); 
     } 
     if(tokens[t].contains("<")&&tokens[t].contains(">")){ 
      tokens[t]=tokens[t].replace(" <", "<"); 
      tokens[t]=tokens[t].replace("> ", ">"); 
      tokens[t]=tokens[t].replaceAll("\\<.*\\>", ""); 
     } 
     tokens[t]=tokens[t].replaceAll("[?¿!¡,.;/'{}]", ""); 
     tokens[t]=tokens[t].replace("\n", "").replace("\r", ""); 

    } 
    return tokens; 
} 
+1

응용 프로그램이 고정되었다는 것은 무엇을 의미합니까? 콘솔에서 예외가 발생 했습니까? – AlexR

+0

어떻게 이클립스 외부에서 응용 프로그램을 실행합니까? 명령 줄을 보낼 수 있습니까? – AlexR

+0

JAR에 * 묶음 *되어야하는 파일을로드하려고 시도하는 것 같습니다. 이 올바른지? – Kai

답변

0

나는 당신의 문제는 힙 메모리의 부족이라고 생각합니다. 항아리를 두 번 클릭하여 응용 프로그램을 실행 중이므로 STDOUT 및 STDERR이없는 javaw이 사용됩니다.

명령 프롬프트를 열고 java -jar yourjar.jar을 입력하여 응용 프로그램을 실행하십시오. 여기서 yourjar.jar은 jar 파일의 실제 경로입니다.

OutOfMemoryError이 표시됩니다. 이제 메모리를 늘려야합니다. 나는이 도움이되기를 바랍니다 귀하의 실행 경로, 즉 :

java -Xmx2048M -jar yourjar.jar

에 매개 변수 -Xmx2048M를 추가합니다. 더 나은 번호를 찾지 못한다면. 분명히이 라인은 애플리케이션이 최대 2G의 힙을 사용할 수 있음을 의미합니다.

이제 질문은 "왜 그렇게 많은 메모리가 필요합니까?"입니다. 코드를 검토하고 어떻게되는지보십시오. 아마도 전체 파일을 메모리에 읽어 들였을까요? 이거 필요하니? 기타

+0

게시물을 가져 주셔서 감사합니다. 사실, 응용 프로그램을 java -jar yourjar.jar로 시작하면 문제가 발생하지 않습니다. 이 문제는 doubleclicking에 의한 직접 실행에서만 발생합니다. – John

+0

또는 cmd에 "yourjar.jar"만 입력하십시오. 그러나 명령 줄에서 어떤 예외도 볼 수 없습니다. – John

관련 문제