2014-01-21 2 views
0

Java에서 많은 양의 텍스트를 토큰 화하려고합니다. 제가 큰 말을 할 때, 나는 한 번에 모든 책의 장을 의미합니다. 책의 한 페이지를 사용하여 코드의 첫 번째 초안을 작성했고 모든 것이 잘 작동했습니다. 이제는 모든 장을 처리하려고하는데 일이 제대로되지 않습니다. 챕터의 일부를 올바르게 처리 한 다음 중지합니다. 다음은Java에서 실제로 많은 양의 텍스트를 처리해야합니까?

는 관련 코드 나는 내 텍스트가 될 것으로 기대 디렉토리에있는 모든 파일을 읽고 있어요 비록

File folder = new File(Constants.rawFilePath("eng")); 
    FileHelper fileHelper = new FileHelper(); 
    BPage firstChapter = new BPage(); 
    BPage firstChapterSpanish = new BPage(); 
    File[] allFiles = folder.listFiles(); 
    //read the files into memory 
    ArrayList<ArrayList<String>> allPages = new ArrayList<ArrayList<String>>(); 

    //for the english 
    for(int i=0;i<allFiles.length;i++) 
    { 
     String filePath = Constants.rawFilePath("/eng/metamorph_eng_"+String.valueOf(i)+".txt"); 
     ArrayList<String> pageToAdd = fileHelper.readFileToMemory(filePath); 
     allPages.add(pageToAdd); 
    } 

    String allPagesAsString = ""; 

    for(int i=0;i<allPages.size();i++) 
    { 
     allPagesAsString = allPagesAsString+fileHelper.turnListToString(allPages.get(i)); 
    } 

    firstChapter.setUnTokenizedPage(allPagesAsString); 
    firstChapter.tokenize(Languages.ENGLISH); 

    folder = new File(Constants.rawFilePath("spa")); 
    allFiles = folder.listFiles(); 
    //for the spanish 
    for(int i=0;i<allFiles.length;i++) 
    { 
     String filePath = Constants.rawFilePath("/eng/metamorph_eng_"+String.valueOf(i)+".txt"); 
     ArrayList<String> pageToAdd = fileHelper.readFileToMemory(filePath); 
     allPages.add(pageToAdd); 
    } 

    allPagesAsString = ""; 

    for(int i=0;i<allPages.size();i++) 
    { 
     allPagesAsString = allPagesAsString+fileHelper.turnListToString(allPages.get(i)); 
    } 

    firstChapterSpanish.setUnTokenizedPage(allPagesAsString); 
    firstChapterSpanish.tokenize(Languages.SPANISH); 

    fileHelper.writeFile(firstChapter.getTokenizedPage(), Constants.partiallyprocessedFilePath("eng_ch_1.txt")); 
    fileHelper.writeFile(firstChapterSpanish.getTokenizedPage(), Constants.partiallyprocessedFilePath("spa_ch_1.txt")); 
} 

의 모든 파일의 첫 번째 쿠데타가 추가되고있다 내가 처리하고있는 문자열. 그것은 잠시 후에 코드가 여전히 실행되지만 특정 시점까지만 문자열에 문자열을 추가하는 것처럼 보입니다.

모든 파일을 한꺼번에 처리 할 수 ​​있도록 변경해야하는 항목은 무엇입니까? 당신이 더 큰 문자열을 복사하는 경우

+1

"그냥 멈춤"을 정의하십시오. 오류 메시지가 나타 납니까? 그렇다면 메시지는 무엇입니까? (그렇지 않은 경우 코드에 버그가 있거나 실제로 중지되지 않았지만 성능을 크롤링에 끌어 들일 정도로 심하게 스와핑됩니다.) 문제를 진단하기 위해 지금까지 수행 한 작업은 무엇입니까? – keshlam

+0

빈 catch 블록? 로깅 프레임 워크로 일부 로깅을 강력히 고려하십시오. –

+1

코드의 어느 시점에서 "그냥 멈추는가"? 많은 문자열 결합 ('allPagesAsString')을하고있는 것처럼 보이므로, 그 문자열을 ['StringBuilder'] (http://docs.oracle.com/javase/7/docs/api/)로 대체하고 싶을 수도 있습니다. java/lang/StringBuilder.html). 훨씬 더 효율적입니다. [이 질문에 대한 답변] (http://stackoverflow.com/questions/4645020/when-to-use-stringbuilder-in-java)을보십시오. – andersschuller

답변

2

이 부분

String allPagesAsString = ""; 

for(int i=0;i<allPages.size();i++) 
{ 
    allPagesAsString = allPagesAsString+ 
     fileHelper.turnListToString(allPages.get(i)); 
} 

정말 느려집니다.

물건을 조금 속도를 높일 것입니다 모두 StringBuilder를 사용 :

int expectedBookSize = 10000; 
StringBuilder allPagesAsString = new StringBuilder(expectedBookSize); 
for(int i=0;i<allPages.size();i++) 
{ 
     allPagesAsString.append(fileHelper.turnListToString(allPages.get(i))); 
} 

가 한 페이지 한 번에 처리 할 수 ​​없습니다

? 그것은 최선의 해결책이 될 것입니다.

+0

한 번에 한 페이지를 처리 ​​할 수 ​​없습니다. 저는 문장을 두 개의 다른 언어로 번역 된 책으로 정렬 할 수 있도록 문자열을 토큰 화합니다. 페이지가 하나의 언어로 끝나는 곳은 다른 언어로 끝나는 곳이 아니라 모든 챕터가 같은 장소에서 시작하고 멈추는 곳입니다. –

+0

String 대신 StringBuilder를 사용하는 것이 좋습니다. 감사. –

+0

@ j.jerrod.taylor 기뻐요! 내 대답을 수락 해 주셔서 감사합니다. – Ishtar

관련 문제