2012-02-22 4 views
12

Androidアプリでキャッシュの最初のレイヤーを実装しようと考えています。 OOMの例外を確実に避けるためにSoftReferencesを検討していましたが、Androidがこれらを「あまりにも早く」解放する方法に関する記事が多数あるので、android.util.LruCacheキャッシュを調べることにしました。デバイスの機能と空きメモリに応じてLRUキャッシュのサイズを変更する

質問:実際のデバイスのサイズを正しく設定するにはどうすればよいですか? LRUキャッシュがSoftReferencesではなく、実際のソリューションであることはとても素晴らしいことですが、OOM例外を避けることを本当に熱望しているなら、数メガバイトのハードリファレンスを使用することは非常に危険です。あなたが私に尋ねるならば、それはただ安全ではない。とにかく、これは唯一の選択肢のようです。 私はgetMemoryClassを調べて、実際のデバイスでアプリケーションのヒープサイズを調べました(キャッシュをサイジングする前に空きヒープサイズを確認しています)。ベースラインは16メガですが、これはOkですが、私はEOM例外を5メガバイトのヒープサイズ(Eclipse MATによると)だけ投げているデバイス(旧式の例ではG1)を見てきました。私はG1が非常に古くなっていることを知っていますが、ポイントは私の経験が実際には文書で言及されている16メガベースラインと一致していないということです。したがって、私が合理的に得ることができる最大のものが必要な場合は、どのようにLRUキャッシュをどのようにスケールアップするべきか、私は完全には不明です。 (8メガに満足しており、低スペックのデバイスで1メガバイトと小さくなるだろう)

ありがとうございました。

編集:私が参照してるAndroidのLRUキャッシュクラス:あなたの質問からhttp://developer.android.com/reference/android/util/LruCache.html

答えて

14

私はLruCacheサイズを計算するための有効な解決策は、DEVガイドに概説されていると思う:

int memClass = ((ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass(); 
int cacheSize = 1024 * 1024 * memClass/8; 

詳しい情報はここで見つけることができます:アンドロイドでhttp://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

+0

ええ、私はメモリクラスを使用して同様の方法を終了しました。私はまだそれが推測のあまりにも多くを見つけるが、私はより正確な方法に遭遇していない。 – user289463

+3

sizeOfもバイト単位のサイズを返すことを確認してください。上のリンクでは、彼らはbitmap.getByteCount()/ 1024を返しました(キロバイトで!これはもちろん動作しますが、cacheSizeは1024 * memClass/8でなければなりません) – DominicM

0

あなたが求めているものを理解するために混乱のビット。私はそれを打つことを許可しなさい。

さまざまなキャッシング製品AppFabric、memcached、ncache、およびscaleoutには、オブジェクトごとに1Mの制限があります。スケールアウトはある種のカスタマイズを提供すると私は思う。

ただし、これらはすべてサーバー側の製品です。だからおそらく単一のホストローカルキャッシュだけであるアンドロイドデバイスの場合、私はおそらく最大64kbで行くだろう。私は、なぜ誰かがデバイス上のオブジェクトあたり64kb以上を必要とすることを意味します。ちょうど私の推測。

私があなただったら、memcached(最も有名なオープンソースのキャッシュソリューション)を学びます。また、スケールアウトで作業できるようになったので、スケールアウトすることもできます。比例して決定する。

+0

こんにちはシッダールタ、 の非常に典型的な目的キャッシュ(メモリとストレージ)はリストとサムネイルをキャッシュします。 1つのサムネイルは、それ自体が簡単に20kバイトになり、グリッドに40〜50個のサムネイルを表示します。 私はメガバイトについて話しています。問題は、Android固有の観点から適切なサイズを見つけることです。あなたのサーバのハードウェアは分かっているが、あなたのAndroidアプリが実行される700以上の異なるHW構成すべてを知っているわけではないので、サーバ側のソリューションには関係しない。 – user289463

+0

私は間違いないと思いますが、Androidにはメモリよりも低速のセカンダリストレージがありません。それらはすべて同じメモリ、プライマリ、セカンダリです。だから誰がLRUキャッシュが必要なのだろう?私は疑問に思う ? – Siddharth

+0

LRUキャッシュで使用するRAMがあります。これは最も速いです。次に、次に高速である内部ストレージがあります。外部ストレージもありますが、それは何か、遅いSDカードさえあります。私はここで私のL1キャッシュとしてRAMについて話しています。 – user289463