gpt4 book ai didi

java - Java 中的 XML JDOM 解析器中的 OutOfMemoryError

转载 作者:数据小太阳 更新时间:2023-10-29 03:02:33 25 4
gpt4 key购买 nike

为 Android 开发字典应用程序。 XML 文件中有一个数据库。用 DOM 解析器解析它非常大(72MB)。尝试使用 JDOM 解析器解析它:

List<org.jdom2.Element> list = null;
try {
File db = new File(UnZip.DATABASE_PATH);
InputStream stream = new FileInputStream(db);
SAXBuilder builder = new SAXBuilder();

//HERE CODE IS GETTING STUCK
Document document = (Document) builder.build(stream);
org.jdom2.Element rootNode = document.getRootElement();
list = rootNode.getChildren(ENTRY_TAG);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for (Element node : list) {
Log.d(LOG_TAG, node.getChildText(ENT_SEQ));
Log.d(LOG_TAG, node.getChildText(REB));
}

这段代码给出了 OutOfMemory 错误:

06-05 12:45:58.788: E/AndroidRuntime(10068): FATAL EXCEPTION: main 06-05 12:45:58.788: E/AndroidRuntime(10068): java.lang.OutOfMemoryError: [memory exhausted] 06-05 12:45:58.788: E/AndroidRuntime(10068): at dalvik.system.NativeStart.main(Native Method)

我假设代码卡在这里:

Document document = (Document) builder.build(stream);

如何避免此错误并从整个 XML 文件(170000 个条目)中找到所需的条目?

最佳答案

JDOM 与 DOM、XOM 和所有其他内存中 xml 模型库一样,将在内存中表示整个 XML 文档。如果您认为大多数 XML 文档都是单字节编码的(UTF-8 或 ASCII),然后在 Java/Android 中将其转换为 2 字节字符,内存中的 XML 表示通常需要两倍的时间内存作为原始 XML 文档。

与其他人相比,JDOM 非常尊重内存使用(我是维护者,我有偏见,但我在内存管理方面也非常非常努力地尝试过)。

您可以尝试使用 the SlimJDOMFactory作为文档构建的一部分,但这不会像您需要的那样节省您的钱。

所有内存中的 XML 模型以及(对于不同的文档大小)在所有平台和系统配置上都存在同样的问题。

解决方案是:

  • 找出how much memory you re allowed
  • 没有这么大的文件。 Android 上的 72Meg 文档似乎......多余。
  • 不要一次解析整个文档,而是使用流式系统进行解析(SAX 等)
  • 将处理卸载到服务器应用程序。
  • 其他。

关于java - Java 中的 XML JDOM 解析器中的 OutOfMemoryError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24054662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com