我应该如何处理Java中真正大量的文本?

时间:2014-01-21 20:18:06

标签: java performance text-processing

我正在尝试用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 个答案:

答案 0 :(得分: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)));
}

你不能一次处理一页吗?那将是最好的解决方案。

相关问题