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;
}
}