我在使用下表从SQLite3表中加载大约60张图片时遇到了一些性能问题:
select rowid, thumbnail
from my_table
where category_id = 4
我在category_id上有索引,但加载170张70x70 PNG图像的表大约需要2.5秒。
在我的代码中,我创建了一个表示每一行的对象的NSMutableArray,如下所示:
Item* item = [[Item alloc] init];
item.rowid = sqlite3_column_int( statement, 0 );
int thumbnailLength = sqlite3_column_bytes( statement, 1 );
NSData* data = [NSData dataWithBytes:sqlite3_column_blob( statement, 1 ) length:thumbnailLength];
item.thumbnail = [[UIImage imageWithData:data] autorelease];
[result addObject: item]
iPhoto可以加载几乎没有可见加载时间的相册。是否有一些我缺少的SQLite3技巧可以提高性能?
答案 0 :(得分:1)
我认为照片应用程序仅加载在给定时间在屏幕上可见的缩略图图像,在向下滚动列表中的列表时检索其他图像。使用3.x,NSFetchedResultsController及其setFetchBatchSize:方法中的Core Data很容易做到这一点。使用原始SQLite手动实现它将需要更多代码,但它仍然可行。这种方法既有加载时间也有内存优势。
在我的SQLite数据访问中,我没有注意到一个显着的加载时间从SQLite数据库中提取了多达17个150 x 50的PNG图像,所以有可能还有其他东西会减慢你的速度。您也可以尝试在数据加载方法上运行Instruments和Shark,看看SQLite是否确实是您的瓶颈。我有一个案例,我认为它是,但事实证明我有一个低效的字符串处理例程,这真的减慢了我从SQLite数据创建对象。