Android中的SimpleXML OutOfMemory错误
我在Android项目中使用Simple2.4.1库。我在试图处理一个700KB(约6k行)的XML文件时遇到了这个OutOfMemory错误—这里的处理意味着读取文件,进行一些计算,然后将结果写入一个新文件。它在一个600KB的文件中运行良好,至少我还没有遇到同样的错误 以下是XML的外观:Android中的SimpleXML OutOfMemory错误,android,out-of-memory,simple-framework,Android,Out Of Memory,Simple Framework,我在Android项目中使用Simple2.4.1库。我在试图处理一个700KB(约6k行)的XML文件时遇到了这个OutOfMemory错误—这里的处理意味着读取文件,进行一些计算,然后将结果写入一个新文件。它在一个600KB的文件中运行良好,至少我还没有遇到同样的错误 以下是XML的外观: <items> <item1 id="1"> <subitem1 id="1"> <subsubitem1 id=
<items>
<item1 id="1">
<subitem1 id="1">
<subsubitem1 id="a">
<iteminfo>
<info>blublub</info>
<info>blublub</info>
</iteminfo>
</subsubitem1>
<subsubitem1 id="b">
<iteminfo>
<info>blublub</info>
<info>blublub</info>
</iteminfo>
</subsubitem1>
</subitem1>
</item1>
</items>
布鲁布
布鲁布
布鲁布
布鲁布
有什么解决办法吗?这可能只是在内存中保存了太多内容而没有对其进行处理。如果您仔细想想,如果您正在将一个文件读入700kb的内存,并且为xml解析的其余部分、您的应用程序以及其他需要在设备上占用一些内存和CPU时间的应用程序添加了开销,那么归结起来,这不是一个好主意 没有这样的解决方法,从编程的角度来看,您发现的任何方法都不是很好,因为您仍在尝试在内存中保存700kb的xml,而您可能不需要大部分
我建议您尽快从内存中删除这些数据,以释放资源。您可以将找到的元素以有意义的方式保存到文件或其他内容中,并通过数据库建立索引,这样可以保存大量数据,但您可以在数据库中查找特定的数据,而不是将其全部保存在内存中,只将其带回内存。这样可以限制您对资源的使用,下载您的应用程序的人在您使用大量内存时不会产生怀疑。我从未使用过SimpleXML,但据我所知,他们使用了一种基于DOM的解析方法对2.3版前后的XML进行反序列化,以减少以前对StAX框架的依赖。Simple也是一个JavaSE库,没有针对移动设备进行优化。不幸的是,这两件事常常伴随着OutOfMemoryError 我不会说您正在解析的XML无论如何都是一个“巨大”的文件,但它是实质性的。根据您的程序当时使用内存的其他用途,您可能会在堆中加满内存。以下是一些需要记住的经验法则:
- 预计在许多设备上,整个应用程序的可用大小不超过16MB。在一些较新的设备上,这接近24MB,但在很长一段时间内,16MB是标准堆大小
- 我还没有看到Simple发布的任何数字,但传统上,一个完全加载的DOM需要大约4倍于它来自的XML的内存大小(在您的例子中大约是3MB)。如果您是从远程位置获取此XML,那么它可能同时还在内存中一段时间
希望有帮助 您可以使用SAX解析器,而不是一次解析整个XML文档。SAX解析器将XML文档作为流读取,并在到达特定标记时触发相应的事件。它不像使用SimpleXML那样方便
下面是一个可能会有所帮助的教程:我目前正在做的是:使用嵌套循环迭代
items
对象,获取iteminfo
对象,并对子对象执行一些操作。然后将结果作为子元素插入iteminfo
。我将info
设置为null以减小文件大小,并将所有内容保存到新文件中。好的,我想我现在可以看到我是如何从记忆错误中得到这个的。。不幸的是,数据库不是我的选择,所以我想我必须重写我的逻辑。谢谢你的启示!是的,我试过上面提到的那些步骤。我决定使用SimpleXML,因为将其序列化和反序列化为POJO非常方便。但直到现在,我还从未对“大”文件进行过测试。无论如何谢谢你!我使用的是Archos7,可用的系统存储容量为29MB,内部闪存容量为6GB。XML文件保存在外部存储器中。嗯,我想我在处理数据的过程中消耗了很多内存。谢谢和+1表示另一个启示。@blubblub:不是存储空间,存储与应用程序的运行无关。堆空间是RAM,几乎所有的Android设备都由系统管理为相同的值。Archos运行2.2,因此可能更接近24MB。干杯