0

私のアプリでは、約400MiBのHTMLドキュメントをダウンロード、処理、保存する必要があります(SQLiteで)。問題は、それだけのデータをsqliteに挿入する(約60kの挿入)のに非常に長い時間がかかることです。トランザクションとプリコンパイル済みステートメントを使用していますが、それでもかなりの時間がかかります。ローエンドの電話では、最大2時間かかる場合があります。ハイエンドのものでは、少なくとも10〜12分です。

これはすべてで行われるIntentServiceため、アプリがバックグラウンドにある間も続行できます。マニフェストで最も要求することを高速化するlargeHeapために、VMで使用可能なメモリに基づいてトランザクションサイズを設定します。これのおかげで、サービスは簡単に100MiBのRAMを使用できます。このため、アプリがバックグラウンドに入った直後にサービスが強制終了/一時停止されます。で使用startForegroundServiceてダウンロードの進行状況を表示しますが、役に立ちません。

これは、HTC One Xのようなハイエンドの電話でも、このプロセス中にシステムに200MiBを超える空きRAMがある場合でも発生します。

このメモリを大量に消費するサービスがシステムによって強制終了されないように保護する方法はありますか?現在、プロセスは再起動し、1つのセグメントがループで処理されているように見えます。これは、システムがそのセグメントを終了する前に強制終了するためです。トランザクションサイズを小さく設定すると、メモリ消費量は減少しますが、時間が倍増します。ハイエンドの電話では25分を超えることはできません。

編集: これは主にAndroid4以降で発生します。Android2.3.3ははるかに安定しているように見えます。

4

1 に答える 1

0

私のアプリでは、約 400MiB の HTML ドキュメントをダウンロードし、処理し、(SQLite で) 保存する必要があります。

400MiB の SQLite データベースをドキュメントとともにダウンロードして保存することを検討してください。データベースはサーバー上に準備されています。

また、少なくとも Android 2.x デバイスの場合は、そのデータベースのみを外部ストレージにダウンロードして保存してください。

このメモリを大量に消費するサービスがシステムによって強制終了されないようにする方法はありますか?

いいえ。

数か月前、私は保存オプションを試してみましたが、それらのドキュメントをファイルとして保存することは破棄されました。これは、約 60,000 (つまり 60) のドキュメント、つまりファイルであるためです。

これでは、400MiB のデータベースが 60,000 ファイルを含むディレクトリ構造よりも優れていると考える理由が説明できません。

于 2013-02-13T12:45:11.287 に答える