我维护一个正在收集大量信息的应用程序,并将这些信息存储在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 TRANSACTION
和COMMIT TRANSACTION
不会有什么区别。
有什么方法可以优化这种行为吗?
该应用程序正在读取sdcard(或外部存储)的内容,并正在创建一个清晰的用户友好视图。 我有很多想法来进一步改进这个应用程序,但是对于这个基于数据库的方法来说更加灵活和容易处理。但只要“成本”(就收集数据而言的时间而言)与看起来似乎一样高,我就无法这样做...... –
与我的高分系统一样的用例。我将高分数据作为JSON存储在存储上,并将它们显示在花哨列表中进行一些过滤/排序。列表模型的数据作为对象存储在数组列表和内存中。如果你有很多条目,并且堆内存将会成为问题,那么SQLite游标查询可能是丢失模型的更好选择 –