2

ある時点で計算のためにアクセスする必要がある 100k 値の大きな double 配列と long 配列がいくつかあります。largeHeap が要求されても、Android OS は十分なメモリを提供せず、ほとんどのテスト済みデバイスでメモリ不足の例外が発生し続けます。だから私はこれを克服する方法を研究し、前の質問で Waldheinz から得た回答によると、ファイルに基づく配列を実装し、RandomAccessMemory を使用してチャネルを取得し、提案されているように MappedByteBuffer を使用してそれをマップしました。 、MappedByteBuffer を asLongBuffer または asDoubleBuffer として使用します。これは完璧に機能します。メモリ不足の例外を100%排除しました。しかし、パフォーマンスは非常に悪いです。get(いくつかのインデックス)への呼び出しが多く、それぞれ約5〜15ミリ秒かかるため、ユーザーエクスペリエンスが台無しになります

いくつかの有用な情報:

  1. 配列でバイナリ検索を使用して開始インデックスと終了インデックスを見つけ、開始から終了までの線形ループを作成しています
  2. 終了するのに 5 ミリ秒以上かかる get() 呼び出しに対して印刷コマンドを追加しました (かかった時間、要求されたインデックス、および最後に要求されたインデックスを出力します)。線形のリクエストも同様でした。

それをより速くする方法についての提案はありますか?

4

1 に答える 1

2

アプローチ1

データのインデックス作成 - クイック検索用のポインタを追加

  • ソートされたデータを 1000 個のバケットに分割し、それぞれに 100 個の値を入れます
  • 各バケットの開始と終了を参照するインデックスを維持する
  • アルゴリズムは、最初にこのメモリ インデックスでバケットを検索し (これにはループでも問題ありません)、メモリ マップ ファイルでこのバケットにジャンプします。

これにより、ファイル (検索する単一のバケット) に対する単一のジャンプと、最大 100 要素の反復が発生します。

アプローチ 2

軽量の組み込みデータベースを利用します。つまり、MapDBはAndroid をサポートしています。

于 2013-10-27T09:03:04.410 に答える