0

Android でエンジニアリング業界向けのカタログ作成アプリケーションを使用しています。Android端末には30万点以上のデザイン画像がアップロードされています。毎日 200 を超える新しい画像がデバイスに同期されています。

デザインの詳細が格納されている CatalogDetail というテーブルがあります。さまざまな属性を格納するための約 20 列と、サムネイル用と大きな画像用の 2 つの画像パスがあります。サムネイル画像の平均サイズは約 20KB で、大きな画像の平均サイズは約 40KB です。そして、これらの画像はすべて同じフォルダーに保存されます (データベースではありません)。30 万枚の画像の全体のサイズは約 6GB です。さまざまな検索条件に従って、サムネイル画像と簡単な説明がアプリケーション内のグリッドに表示されます。

フォルダーに 5000 枚の画像がある場合、アプリケーションは正常に動作しますが、データのサイズが大きくなるにつれて、アプリケーションの速度が低下します。現在30万枚の画像をロードした後、250枚の画像をグリッドにロードすると(エンドユーザーは少なくとも250枚の画像を一気にロードしたい)、グリッドへのロードは比較的遅くなりますが、スクロールしようとするとかなり時間がかかりますこれは望ましくありません。

SQL のプロファイリングを行ったところ、SQL にかなりの時間がかかっていないことがわかりました (データを取得するのに 1 秒未満)。最後に、問題はフォルダーからの画像の読み込みにあることがわかりました。画像は内部メモリに保存されます。アプリケーションは、Android 3.1 (ハニカム) OS、RAM 1GB、16GB の内部メモリを搭載した Samsung Galaxy Tab 750 10.1 インチで動作しています。アプリケーションは SDK 10 を使用して開発されています。また、エンド ユーザーからの基本的な要件の 1 つは、デザイン イメージが非常に独自のものであり、デバイスからコピーする必要があることです。そのため、画像フォルダーは非表示になり、アプリケーションの外部からアクセスできなくなります。

パフォーマンスを向上させる方法を教えてください。
1.画像がインデックスの場合、パフォーマンスを改善できますか? インデックスできますか(何かソフトやアプリ等はありますか?)
2. 各フォルダに1000枚の画像を保存し、300個のフォルダを作成してそこから画像にアクセスすると、パフォーマンスが向上するでしょうか?すべての画像を再読み込みし、テーブル内の画像の場所を変更する必要があるため、これは最後のオプションである必要があります

パフォーマンスを向上させる方法を教えてください。
ご協力いただきありがとうございます。

検索機能は次のメソッドを実行します。

private void ShowData() {
    try {
        Cursor countc = dal.getCursor("Select count(*) From Product " + whereCondition);
        SQL = "Select ID as _id, Name, Code, ProductWeight, '" + fileLoc + "' || ImageLoc as ImageLoc, ReleaseDate From CatalogDetail " + whereCondition;
        Cursor c = dal.getCursor(SQL + " Order By " + orderByField + " " + OrderSeq);

        ProductGridView.setAdapter(new CatalogueListAdapter(this, c));
    } catch (Exception e) {
        e.printStackTrace();
    }
}  

これは、カタログがグリッドにロードされる方法です。

public class CatalogueListAdapter extends SimpleCursorAdapter {
    private Context context;
    private Cursor c;

    public CatalogueListAdapter(Context context, Cursor c) {
        super(context, R.layout.thumbnail, c, new String[] {}, new int[] {});
        this.context = context;
        this.c = c;
    }
    @Override
    public View getView(int position, View inView, ViewGroup parent) {
        View v = inView;
        if (v == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.thumbnail, null);
        }
        c.moveToPosition(position);

        ImageView ivThumb = (ImageView) v.findViewById(R.id.thumbnail);
        String imageLoc = this.c.getString(this.c.getColumnIndex("ImageLoc"));
        if (imageLoc != null) 
            ivThumb.setImageURI(Uri.parse(imageLoc));
        return v;
    }
}
4

1 に答える 1

0

私が自然に思いつくのは、写真を名前に基づいてサブフォルダーに単純に配布することです。それが不可能な場合は、それに適した名前を付けることです。

通常、open() 呼び出しでは、ディレクトリと呼ばれる特別なファイルをスキャンする必要があります。エントリが多数ある場合、この線形検索は非常に遅くなる可能性があります。

よろしければ、私の提案は「インデックス作成」に少し似ていますが、ここでは「ハイブリッド」アプローチが好きです。オーバーヘッドが少ないため、バブル ソートは常に少数のアイテムに対してのみ最速であるという理由だけで、同様のルールがディレクトリにも適用されます。

そのため、画像をファイル名またはファイル名のハッシュ値で配布できる場合は、サブディレクトリ構造を使用して配置します。もちろん、均等な分散がここでの主な目標でなければならないので、名前またはハッシュ関数を賢く選択してください。

要約すると:

  1. はいといいえ; 上記のテキストを参照してください。;)
  2. はい、私はそれを好みます。なぜなら、問題が本当に open() にあるという私の仮定が正しい場合、追加のインデックスだけでは役に立たないからです。
  3. 繰り返しますが、私の仮定が正しければ、スレッド化は役に立ちません。
于 2013-02-01T11:38:41.320 に答える