2014-01-21 54 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

它看起來像你使用StringBuilder而不是String工作的建議。謝謝。 –

+0

@ j.jerrod.taylor很高興工作!感謝您接受我的回答。 – Ishtar