Android中的SimpleXML OutOfMemory错误

我在我的Android项目中使用Simple 2.4.1库。尝试处理700 kB(~6k行)的XML文件时,我得到了OutOfMemory错误 - 这里的处理意味着读取文件,进行一些计算,然后将结果写入新文件。它在600 kB文件下运行良好,至少我还没有得到相同的错误。 这是XML的样子:
<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倍的内存大小(在你的情况下约为3MB)。如果您从远程位置获取此XML,它可能在一段时间内同时仍在内存中。 听起来当时你的程序中正在发生的任何其他事情都足以吃掉除了几MB的堆之外的任何东西,并且你可能正处于你正在测试的任何平台的边缘。 如果您相对确定在应用程序的此操作期间无法清除其他地方的内存使用情况,我建议您切换到使用SAX或Pull的基于流的解析库。 希望有帮助!     
您可以使用SAX解析器,而不是一次解析整个XML文档。 SAX解析器将XML文档作为流读取,并在到达特定标记时触发相应的事件。它不像使用SimpleXML那样方便。 这是一个可能有用的教程:http://www.ibm.com/developerworks/opensource/library/x-android/     

要回复问题请先登录注册