Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中的SimpleXML OutOfMemory错误_Android_Out Of Memory_Simple Framework - Fatal编程技术网

Android中的SimpleXML OutOfMemory错误

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=

我在Android项目中使用Simple2.4.1库。我在试图处理一个700KB(约6k行)的XML文件时遇到了这个OutOfMemory错误—这里的处理意味着读取文件,进行一些计算,然后将结果写入一个新文件。它在一个600KB的文件中运行良好,至少我还没有遇到同样的错误

以下是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倍于它来自的XML的内存大小(在您的例子中大约是3MB)。如果您是从远程位置获取此XML,那么它可能同时还在内存中一段时间
听上去,当时程序中发生的任何事情都足以消耗掉除了几MB以外的所有内存,而且无论您在什么平台上进行测试,您都可能处于边缘

如果您相对确定在应用程序中的此操作期间无法清除其他地方的内存使用情况,我建议切换到使用SAX或Pull的基于流的解析库


希望有帮助

您可以使用SAX解析器,而不是一次解析整个XML文档。SAX解析器将XML文档作为流读取,并在到达特定标记时触发相应的事件。它不像使用SimpleXML那样方便


下面是一个可能会有所帮助的教程:

我目前正在做的是:使用嵌套循环迭代
items
对象,获取
iteminfo
对象,并对子对象执行一些操作。然后将结果作为子元素插入
iteminfo
。我将
info
设置为null以减小文件大小,并将所有内容保存到新文件中。好的,我想我现在可以看到我是如何从记忆错误中得到这个的。。不幸的是,数据库不是我的选择,所以我想我必须重写我的逻辑。谢谢你的启示!是的,我试过上面提到的那些步骤。我决定使用SimpleXML,因为将其序列化和反序列化为POJO非常方便。但直到现在,我还从未对“大”文件进行过测试。无论如何谢谢你!我使用的是Archos7,可用的系统存储容量为29MB,内部闪存容量为6GB。XML文件保存在外部存储器中。嗯,我想我在处理数据的过程中消耗了很多内存。谢谢和+1表示另一个启示。@blubblub:不是存储空间,存储与应用程序的运行无关。堆空间是RAM,几乎所有的Android设备都由系统管理为相同的值。Archos运行2.2,因此可能更接近24MB。干杯