android地面服务内存不足

android地面服务内存不足,android,memory,service,android-service,Android,Memory,Service,Android Service,在我的应用程序中,我需要下载、处理和存储(在SQLite中)大约400MiB的HTML文档。问题是,将这么多数据插入sqlite(~60k个插入)需要很长时间。我使用事务和预编译语句,但它仍然需要很多时间。在低端手机上,这可能需要两个小时。在高端手机上,至少需要10-12分钟 所有这些都是在IntentService中完成的,因此它可以在应用程序处于后台时继续。为了加快速度,我要求清单中有一个largeHeap,并根据VM可用的内存设置事务大小。由于这一点,该服务可以轻松地占用100MB的RAM

在我的应用程序中,我需要下载、处理和存储(在SQLite中)大约400MiB的HTML文档。问题是,将这么多数据插入sqlite(~60k个插入)需要很长时间。我使用事务和预编译语句,但它仍然需要很多时间。在低端手机上,这可能需要两个小时。在高端手机上,至少需要10-12分钟

所有这些都是在
IntentService
中完成的,因此它可以在应用程序处于后台时继续。为了加快速度,我要求清单中有一个
largeHeap
,并根据VM可用的内存设置事务大小。由于这一点,该服务可以轻松地占用100MB的RAM。因此,在应用程序进入后台后不久,服务就会被终止/暂停。我在
服务中使用
startForeground
并显示下载进度,但它没有帮助

即使在诸如HTC One X这样的高端手机上,即使系统在此过程中有超过200MB的空闲RAM,也会发生这种情况

有没有办法保护这个内存不足的服务不被系统杀死?当前,进程看起来像是重新启动,一个段正在循环中处理,因为系统在完成该段之前终止。设置较小的事务大小将减少内存消耗,但会使时间成倍增加,在高端手机上超过25分钟是不可接受的

编辑: 这主要是安卓4和更高版本上的问题。安卓2.3.3看起来更加稳定

在我的应用程序中,我需要下载、处理和存储(在SQLite中)大约400MiB的HTML文档

考虑下载并存储一个包含文档的400MiB SQLite数据库,该数据库是在服务器上准备的

另外,请仅下载该数据库并将其存储在外部存储器上,至少对于Android 2.x设备

有没有办法保护这个内存不足的服务不被系统杀死

没有

几个月前,我尝试了存储选项,将这些文档存储为文件被丢弃,因为它大约有6万(是的,60)个文档,即文件


这并不能解释为什么您认为400MiB数据库优于包含60000个文件的目录结构。

您需要检查程序的设计。考虑将文档存储在SD卡上,并将索引存储在数据库中。这是一个数据复制/同步问题,可以作为后台服务零碎地完成。但你不能逃避一个事实,那就是这将需要很长时间。因此,仔细考虑一下设计。@GR8DAN几个月前,我尝试了存储选项,并将这些文档存储为文件,但被丢弃了,因为它大约有6万(是的,60)个文档,即文件。目前,它是SD卡上的SQLite数据库,所有这些文档都是唯一的。相比之下,同样的过程在iPhone5上大约需要7分钟,但应用程序不能进入后台。我知道最好是在服务器上准备数据库。我已经告诉我的客户好几次了,但是服务器人员在任何不远的将来都不会这么做。数据库位于SD卡上(应用程序的外部缓存目录中)。在我的测试中,打开一个包含60k文件的目录非常慢。将其划分为文件夹可以使我平均访问约10k个目录,其中包含6个文件,但速度仍然很慢,尤其是在速度较慢的SD卡上。@Shell:“但服务器人员在最近(甚至遥远)的将来都不会这样做”--那么客户端就不应该抱怨处理速度了。:D我知道。另一个问题是,服务在后台死亡。我刚刚发现这项服务并没有经常被终止,但我得到了一个服务器连接超时,即使我获得了
部分唤醒锁定
,以防止CPU关闭和
WifiLock
WIFI\u MODE\u FULL\u HIGH\u PERF
@shell:所有这些都将确保硬件不会妨碍你。根据您的服务器协议和设置,如果您没有对服务器执行某种类型的“心跳”,则服务器可能会认为您在一段较长的时间后离开,并从其侧面终止套接字,或者放弃。只有在第一次连接时快速关闭显示器时,我才会收到此超时,然后它就超时了。显示器处于打开状态时的其他连接没有问题。真奇怪。