実際、私はWebサービスから25,000のJSONオブジェクトを取得しています.Jacksonを使用してそれらを解析しています.コレクション(HashMap、LinkedHashMap、Array List、Map)にそれを入れようとしているとき、残念ながらそれらすべてを使用しています. 「Androidのメモリ不足例外」に..私の場合、誰かがこれを以前に巨大なオブジェクトで実験したことがありますか?最大で5万オブジェクトになる可能性があります。では、どうすればより良い方法で処理できますか。上記のコレクションを拡張してカスタマイズされたオブジェクトを作成しようとしましたが、それを取得するには十分ではありません。提案をお願いします。
4 に答える
十分なメモリがあれば、50,000 または 5000 万のオブジェクトは問題になりません。メモリが限られている場合、メモリ カードなどのディスクに値を保存する方法があります。キーごとに 1 つのファイルを持つことができ、ファイルの内容が値になります。値が小さい (< 1 KB) 場合は、何らかの方法で値を組み合わせて使用量を減らすことができます。データはテキストであるため、データを圧縮してディスク使用量を削減することもできます。
最近の値のキャッシュを保持できます。このキャッシュは、最後の 10 ~ 1000 個のキー/値である可能性があるため、ディスク上の残りのキー/値にすばやくアクセスできます。
データを圧縮した後、デバイスのストレージに収まらない場合は、ストレージをサーバーに移動し、必要な情報をネットワーク経由で抽出する必要がある可能性があります。
メモリ内のオブジェクトが本当に必要ですか? アイテムを解析して、sqlite データベースに保存できます。アイテムを表示したい場合は、必要なアイテムのみをデータベースから取得します。
Java には、実装されているサードパーティ ライブラリがいくつかあります。コレクションをハードディスクに保存します。MegaMap に似ていますが、Android 上にあります。あまりテストされていないと思います。
http://megamap.sourceforge.net/index.html
50,000 オブジェクトを取得できるので、sqlite データベースを実装して情報を格納することをお勧めします。必要なときに必要な情報だけを取得できるようにします。お役に立てれば。
メモリ フット プリントを削減するための 1 つの手法:
文字列について話しますが、以下は他のオブジェクトにも当てはまります。
複数のインスタンスで同じ (.equals) オブジェクトを保持しないようにするには、次のようにします。
private Map<String, String> sharedStrings = new HashMap<>().
public void shareString(String s) {
String t = sharedStrings.get(s);
if (t == null) {
t = s;
sharedStrings.put(t, t);
}
return t;
}