![]() |
1
5
在我讨论解决方案之前,您的评估策略存在某些问题。 1) 您还没有合并NSLog和while循环所花费的时间。75%的时间被他们占用 而您只需要比较intForColumn与attributesOfItemAtPath。正确的方法是运行仪器 Timer Profiler 并比较检索单个记录的时间。 2) 您已将FMDB用作文件管理器。FMDB内部序列化文件中的数据。FMDB/SQL Lite的核心在于它的数据结构,特别是你根本没有使用过的索引。 所以,即使您比较记录所花费的时间,您也会发现FMDB比文件管理器花费更多的时间,因为以特定格式序列化数据需要额外的开销。 3) X条记录的访问时间与对磁盘(硬盘驱动器)而非堆进行访问的次数进行比较。在这两种情况下,您所做的都是数据存储的堆访问。所以你根本看不出有什么不同。 这是否意味着文件管理器优于FMDB,绝对不是!! 以下是几个原因: FMDB只有在配置为这样做时才能表现良好。 FMDB的核心在于两个方面:分页(缓存到堆中)和索引。 让我一次一个地向你解释。 1) 假设您正在尝试访问100个图像的时间戳。其中每个图像具有1000个时间戳。这意味着您必须对数据存储进行100*1000=100000次访问。 如果映像很小,则Filemanager会将文件加载到堆中,访问速度将比FMDB快,但如果没有足够的堆空间,则应用程序会发出内存警告,并从磁盘访问文件,而不是从缓存访问文件,这会慢得多。 所以它是一个二进制状态,要么全部来自堆,要么全部从磁盘 FMDB优于此状态,并根据可用堆空间检索部分记录。当你有一大堆记录时,这会使访问速度更快。 测试此场景的理想方法是对至少10000个图像(而不是时间戳)运行函数延迟测试。这样,与总时间相比,日志时间和迭代速度可以忽略不计。 2) 索引结构,这可以追溯到SQLLite的基础知识。您可能需要添加一个额外的属性调用作为对图像的访问数,并在此基础上对表进行索引。这将大大提高性能。使用Filemeanger不太可能。
我推荐的解决方案。
2) 如果数据>2MB用于核心数据/FMDB。 核心数据具有针对多线程环境的额外性能调整,以及许多其他功能,如加密的无缝集成。 |
|
2
0
首先,正如@kunal所说,你的基准测试方法不是确定性的,会误导你的决策。 话虽如此,attributesOfItemAtPath:如果您只需要修改日期和性能,则会产生一些开销。你能做的就是使用 lstat 相反这与您的情况类似(请注意,我删除了数组以避免基准测试上不必要的开销):
对于748幅图像的输入,我的结果是:
|
![]() |
baronsec · SQL遍历表以查找子字符串 2 年前 |
![]() |
Guillaume · 使用操作从Python列表创建numpy数组 2 年前 |
![]() |
EJ Travel · 如何使用Kotlin中的Room管理登录验证? 2 年前 |
![]() |
Ken · SQL计数或最大值(sqlite) 2 年前 |
![]() |
Eric · Python Crontab无法读取Sqlite3表 2 年前 |