0

我在 Android 中有一个工程行业的编目应用程序。超过 30 万张设计图片已上传到 Android 设备。每天有超过 200 张新图像与设备同步。

有一个名为 CatalogDetail 的表,其中存储了设计的详细信息。它有大约 20 列用于存储不同的属性和两个图像路径,一个用于缩略图,另一个用于大图像。缩略图的平均大小约为 20KB,大图的平均大小约为 40KB。所有这些图像都存储在同一个文件夹中(不在数据库中)。30 万张图片的总大小约为 6GB。根据各种搜索条件,缩略图和简短描述显示在应用程序的网格中。

如果文件夹中有 5000 张图像,则应用程序可以正常工作,并且随着数据大小的增加,应用程序变得越来越慢。现在加载了 30 万张图片后,当我将 250 张图片(最终用户希望一次至少加载 250 张图片)加载到网格中时,加载到网格中相对较慢,但是当我尝试滚动时,它需要相当长的时间长时间(大约 10 – 15 秒),这是不可取的。

我分析了我的 SQL,并发现 SQL 并没有花费大量时间(获取数据不到 1 秒)。最后我发现,问题在于从文件夹中加载图像。图像存储在内部存储器中。该应用程序适用于三星 Galaxy Tab 750 10.1 英寸,配备 Android 3.1(蜂窝)操作系统、1GB RAM 和 16GB 内部存储器。该应用程序是使用 SDK 10 开发的。最终用户的基本要求之一是设计图像是非常专有的,它们应该从设备中复制。所以图像文件夹是隐藏的,不能在应用程序之外访问。

请让我知道如何提高性能。
1. 如果图像是索引,性能可以提高吗?是否可以索引(是否有任何可用的软件、应用程序等?
2.如果我在每个文件夹中保存 1000 张图像,如果我创建 300 个文件夹并从它们中访问图像,性能可以提高吗?但是这应该是最后一个选项,因为我必须重新加载所有图像并修改表中的图像位置
。3.线程可以帮助吗?(我真的不知道线程!)

请建议我如何提高性能。
谢谢你的帮助。

搜索功能将执行此方法:

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 回答