1

4列で5000行のデータベースを持つアプリケーションを開発しています。

problem_id (int)
problem_no (string)
problem_title (string)
dacu (int)

1000 query to fetch problem_no based on problem_idまたはのように、単一のアイテムを大規模に頻繁にクエリする必要がありますsometimes only one item

そこで、すべてのデータベース行を照会し、hashMap実行時にそれらをマップすることにしました。ハッシュマップの挿入/クエリ操作にかかる時間はわずかO(1)か、場合によってはそれ以上になることを知っているので、必要な操作は5000回だけだと思います。しかし、この場合、hashMap はどのくらいのスペースを必要としますか? Androiddalvikは問題なくそれらを割り当てることができますか?

4

2 に答える 2

2

ハッシュマップはどのくらいのスペースを必要としますか?

これは、バージョン、デバイスなどによって異なる可能性がある実装の詳細です。それを理解し、見積もりの​​みを探す限り、実際には非常に簡単に測定できます。Android SDK には、メモリ分析ツールの強力なスイートが含まれています。Eclipse MAT (私の目には最高のもの) をチェックしてください。ハッシュマップが完全に読み込まれたときにヒープ スナップショットを取得し、MAT を使用して必要なバイト数を確認できます。ハッシュ自体、キー、および値の両方を必ず合計してください (私の記憶が正しければ、MAT も計算を実行できます (コア コレクションを非常にうまく処理できます)。

dalvik は割り当てることができますか?

議論のために、ハッシュマップが 1MB のメモリを必要とするとしましょう。それが多いかどうかを感じるには、私たちが住んでいるシステムの制約を理解する必要があります。Dalvik はヒープの最大サイズを制限します。制限はデバイスごとに異なります。非常に古いデバイスの最小値は 16MB です。Samsung Galaxy 2 などのデバイスには約 32MB ~ 48MB があり、Galaxy 3 や 4 などの新しいデバイスには 100MB 以上あります。

アプリで最もメモリを消費するのは通常、ビットマップです。すべてのピクセルは 4 バイトも使用できるため、フルスクリーンのビットマップは簡単に数 MB のメモリを消費します。

これを念頭に置いて、1MB の使用料は悪くないように思えます。これは、素敵な背景画像を使用することに匹敵します:)全体的なメモリ使用量が少ない場合は、必要に応じて分散できます。メモリ分析ツール (MAT または DDMS) を使用すると、アプリが現在使用しているメモリの量を正確に把握できるため、総消費量を簡単に見積もることができます。

他の考え:

  • 通常、パフォーマンスを向上させるためにメモリにキャッシュすることをお勧めします。したがって、あなたのアプローチは私の目には良いものです(メモリの意味を理解している限り)。

  • メモリハッシュマップは最適化のみであるため、特に注意して、メモリに余裕がある場合にのみ実行してください。利用可能なヒープの量を簡単に測定し (そのための API です)、それに応じて決定を下すことができます。メモリ不足の通知イベントを聞くことができます(それらについてはグーグル)。また、失敗した割り当ての OutOfMemoryError 例外をキャッチして、実行時にメモリ戦略を変更することもできます。

  • あなたは正確な測定が難しい分野で遊んでいます。複数のデバイスと Android の複数のバージョンで必ず QA を行ってください。低メモリ設定をシミュレートするには、見つけられる最も古いデバイスを使用してみてください。

于 2013-08-07T05:45:04.153 に答える
1

個人的には、メモリに必要なものを処理する際に問題はまったくないと思います。特に、それらが単なるプリミティブ (ビットマップではない) である場合。

メモリにキャッシュするために最大 10,000 行のクエリを使用しましたが、それらのメモリに関してまったく問題はありませんでした。

この問題は、すべてを処理する必要がある場合に発生する可能性があります。特定のアイテムに到達する速さ、すべての関連アイテムを取得する速さなど.

私が遭遇した 1 つの問題は、UI 関連でした。アダプタに入力して、10k 行すべてを含むリストに表示しようとしましたが、完了するまでに約 7 秒かかりました。それはずっと前のことで、なぜそれが起こったのか正確には思い出せませんが、私が言っているのは、UI スレッドの外で処理を維持し、メモリではなく可能な限り管理することにもっと注意を払うということです。

于 2013-08-07T06:02:06.767 に答える