我有一个图像处理应用程序。我的应用程序将已处理的图像存储在数据库中。每次用户打开应用程序时,应用程序都会开始检查数据库以查看已处理的照片。使用我的代码,这个过程大约需要10-20秒,这对我来说需要很多时间。 数据库只有一列,即图像的路径。我从手机中获取完整的图像列表,然后搜索数据库中列表的每个项目。
我的代码如下:
[RegularAttribute("Dont_turn_me_on_yet")]
public class MyClass
{
public int Value { get; set; }
[SpecialAttribute("On_RightAway_Please")]
public void MethodOne(){}
[RegularAttribute("Dont_turn_me_on_yet")]
public void MethodTwo(){}
}
static void Main()
{
var mc = new MyClass(); //SpecialAttribute constructor is called right away, but not RegularAttribute
}
答案 0 :(得分:3)
对于要检查的每个文件,您正在执行单独的sqlite查询。难怪它很慢!如果有100个文件,则需要进行100次查询。但这可以通过一个简单的查询来完成。您只需要将两种方法合并为1
if-else
这是一个循环,一个查询。我不知道你的照片阵列列表来自哪里,但我觉得那里还有进一步优化的空间。
答案 1 :(得分:2)
几乎所有sql(Sqlite,MySql,....)速度问题的答案是在表上创建索引。请参阅:https://www.sqlite.org/lang_createindex.html 我猜你在你刚刚添加的imgFile上进行全表扫描,就像它得到的那样慢。
你可以做的其他事情(但不像指数那样获得帮助)
1)由于您没有使用从Sqlite返回的imgFile,请将您的sql更改为'Select count() From ... '
,如果存在,将返回大于零的整数。
2)在select语句"Select .... limit 1;"
中添加一个limit子句这将允许Sqlite在找到第一条记录后返回。
答案 2 :(得分:0)
您已经以评论的形式获得了回复!
首先是循环问题,如e4c5所示。当然,这将带来巨大的推动。
第二个是SELECT * FROM table
替换为SELECT field1WhatIreallyNeed, field2WhatIreallyNeed FROM table
。
它还有助于添加索引Where字段。
我已经将sqlite3与NDK集成在一起,因此它在那里使用了C,甚至更快,但是如果你的记录在1个表中接近100万则值得。
最好的答案是评论:你不需要数据库!这将是最快的。想想数据库是如何读取的,存储在哪里? - 在一个文件中,只有另一个约束,解析,处理开销。
我需要数据库,因为我的应用程序会覆盖原始照片,所以 照片总是存在
不,你不需要数据库!
有一个元文件信息
您可以存储在单独的文件downloaded_timestamp
,processed_timestamp
中,您可以计算是否需要处理,这需要几毫秒而不是10-20秒。
因此,删除数据库并使用一个简单的文件,一次性读取该文件中的数据,而不是逐行读取。