2011-10-13 75 views
0

我维护一个正在收集大量信息的应用程序,并将这些信息存储在ArrayList中。为什么写入内存中的SQLITE数据库比使用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即可。 在内存中创建数据库并没有太大的区别。

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

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

有什么方法可以优化这种行为吗?

回答

1

这是opretty明显。假设你已经分配了要插入的对象。 (这是机器人解决方案相同的工作负载)让我们比较选择:

  • 在ArrayList中插入的作用: - (可选)分配细胞的新裂口,如有需要, 指针 - 插入对象的指针到上月底的数组列表 ......真快
  • 插入源码: -prepare插入查询(我希望你用准备好的查询,并没有从字符串来构造它) -perform数据库表中插入与索引等 的修改...很多工作

只有数据库的好处之一是,你可以: - 后来 查询 - 它处理外部存储透明地让你有更多的实体 但它是以牺牲性能为代价。

根据你的目的,可能有更好的选择。

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

+0

该应用程序正在读取sdcard(或外部存储)的内容,并正在创建一个清晰的用户友好视图。 我有很多想法来进一步改进这个应用程序,但是对于这个基于数据库的方法来说更加灵活和容易处理。但只要“成本”(就收集数据而言的时间而言)与看起来似乎一样高,我就无法这样做...... –

+0

与我的高分系统一样的用例。我将高分数据作为JSON存储在存储上,并将它们显示在花哨列表中进行一些过滤/排序。列表模型的数据作为对象存储在数组列表和内存中。如果你有很多条目,并且堆内存将会成为问题,那么SQLite游标查询可能是丢失模型的更好选择 –

2

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

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

否则我不确定你可以做很多事情来提高性能,this link解释了批量插入到SqlLite数据库的方法。

编辑:您也可能想要张贴您的insert代码。

+0

不幸的是,我的应用程序本身并不“知道”数据。该应用程序正在阅读SD卡(或外部存储)的内容,并正在创建一个清晰的用户友好型视图。 –

3

只是为了说明,把BEGIN TRANSACTIONEND TRANSACTION会大大提高性能。引用自http://www.sqlite.org/faq.html#q19

SQLite将很容易在一台普通台式机上每秒钟做5万或更多的INSERT语句。但它每秒只能做几十个事务。默认情况下,每个INSERT语句是它自己的事务...

相关问题