解析/保存/缓存多个文件时减少Java内存使用量

时间:2010-11-19 19:16:51

标签: java io memory-management out-of-memory

申请流程

输入文件由多个逻辑文档组成。

  1. 提取一个输入逻辑文档。
  2. 解析文档中的元素。
  3. 从输入逻辑文档中构建xml。
  4. 将该文档写回物理文件。
  5. 什么是减少内存需求的好方法?

    现在,我将所有逻辑文档保存在ArrayList的物理文件中,以便我执行所有I / O操作一次。但是当我在处理后编写单个逻辑文档进行流处理时,它会在20,000个逻辑文档之后发生Java堆空间错误。输入的逻辑文档数大约为100,000,我正在寻找一种有效的处理方法。写下所有这些文档。

4 个答案:

答案 0 :(得分:2)

不要把所有东西都留在记忆中。相反,您可以随时读取和写入磁盘。例如:

void split(File inputFile, File outputFile) {
    Inputstream is = new BufferedInputStream(new FileInputStream(inputFile));
    OutputStream os = new BufferedOutputStream(new FileOutputStream(outputFile));
    for (;;) {
        Document doc = readDocument(is);
        if (doc == null) break;
        write(buildXml(doc), os);
    }
    os.close();
    is.close();
}

(你显然想要添加错误处理)

这样,在任何给定时间内只有一个逻辑文档在内存中。

答案 1 :(得分:0)

您的问题不在于最小化IO操作,而在于您需要的内存。如果每个逻辑文档都很大,您甚至不会启动该程序并因堆空间而失败。

所以,

  1. 使用每个逻辑文档:加载到内存,形成一个xml并将其卸载到磁盘。
  2. 尽量不要将文档完全加载到内存中:只是其中的一部分。

答案 2 :(得分:0)

您可以考虑通过在物理文件中使用某种分隔符而不是序列化的arraylist将输出写入物理文件,或者将其写入不同的文件,然后将文件连接在一起并在开头写入标题来描述有多少项目文件中有/和/或文件的哪个部分对应于什么序列化项目。但这种方法难以编码,更像是一种先进的方法/痛苦的屁股方式。 Java应用程序只消耗大量内存,你无法做任何事情。

答案 3 :(得分:-1)

使用Sun Java 6 JDK中的jvisualvm内存分析器来查找内存泄漏的位置。