为什么写入内存中的SQLITE数据库比使用ArrayList慢得多?

时间:2011-10-13 09:23:38

标签: android sqlite arraylist

我维护一个收集大量信息的应用程序,并将这些信息存储在ArrayList中。

详细说明这个ArrayList被定义为ArrayList<FileInformation>,它有一些成员像:

private File mFile;
private Long mSize;
private int mCount;
private Long mFilteredSize;
private int mFilteredCount;
private int mNumberOfFilters;

当我想介绍一些新功能时,这种方法可行,但不是很灵活。它在内存使用和可扩展性方面也有一些限制。因此,如果数据库是更好的方法,我做了一些测试。从灵活性来看,毫无疑问,但不知何故,我无法让它以足够快的速度运行,成为真正的替代品。

现在数据库只有一个这样的表:

CREATE TABLE ExtContent (
                        "path" TEXT not null, 
                        "folderpath" TEXT not null, 
                        "filename" TEXT,
                        "extention" TEXT,
                        "size" NUMERIC,
                        "filedate" NUMERIC,
                        "isfolder" INTEGER not null,
                        "firstfound" NUMERIC not null,
                        "lastfound" NUMERIC not null,
                        "filtered" INTEGER not null
                       );

性能问题是巨大的。收集和撰写 ~14000 项目需要 ~3mins !写入数据库时​​,如果写入ArrayList,只需 4-5secs 。 在内存中创建数据库并没有太大的区别。

由于我在SQLITE方面的经验相当有限,我开始通过android.database.sqlite.SQLiteDatabase.insert方法创建条目。

由于基于文件和内存数据库之间没有任何有意义的区别,我猜使用BEGIN TRANSACTIONCOMMIT TRANSACTION不会有任何区别。

有没有办法优化这种行为?

3 个答案:

答案 0 :(得分:3)

为了澄清,放置BEGIN TRANSACTIONEND TRANSACTION会大大提高效果。引自http://www.sqlite.org/faq.html#q19

  

SQLite很容易在普通台式计算机上每秒执行50,000或更多INSERT语句。但它每秒只会进行几十次交易。默认情况下,每个INSERT语句都是自己的事务...

答案 1 :(得分:2)

我在周末编写的应用程序上遇到过类似的问题。

数据库中的数据在发布时是否包含在应用程序中?如果是这样,批量插入不是他们的选择,而是想要查看创建数据库并将其包含在assets目录中并将其复制到设备上。 Here's a great link

否则我不确定您是否可以提高性能,this link解释了批量插入SqlLite数据库的方法。

修改:您可能还想发布insert代码。

答案 2 :(得分:1)

这很明显。假设您已经分配了要插入的对象。 (这与机器人解决方案的工作量相同)让我们来比较替代方案:

  • 在ArrayList中插入:       - (可选)如有必要,为指针分配新的单元格       - 将对象指针插入到数组列表的末尾      ......真的很快
  • 插入sqlite:       -prepare插入查询(我希望你使用准备好的查询,不要从字符串构造它)       -perform数据库表插入和索引修改等。       ...很多工作

只有数据库的优势在于您可以:       - 稍后查询       - 它透明地处理外部存储,允许您拥有更多实体 但它取决于性能成本。

根据您的目标,可能会有更好的选择。

例如,在我的Android游戏中,我将高分条目存储在JSON文件中并使用 GSON Pull解析器/数据绑定层(https://github.com/ko5tik/jsonserializer)从中创建对象。来自外部存储的2000个条目的典型加载时间约为2-3秒