在本地图像文件夹中使用c#搜索图像
我们有一个图片文件夹,里面有大约一百万张图片。 我们需要编写一个程序,根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 N在本地图像文件夹中使用c#搜索图像,c#,.net,search,C#,.net,Search,我们有一个图片文件夹,里面有大约一百万张图片。 我们需要编写一个程序,根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 N 将图像保留在单独的站点或子域上。当然,您可能不希望所有1M文件都位于一个目录中 您需要一个包含(至少)三个表的数据库: 图像文件 身份证件 文件路径 关键词 身份证件 这个词 图像关键字 图像ID 关键字ID 将所有(图像和关键字)存储在数据库中 您可以使用全文索引来搜索单词,或者将每个单词存储为单独的条目 而且,您可以更快
这可能比依赖一个文件系统要快得多,该文件系统不需要在单个文件夹中存储一百万个条目。有Win32 API FindFirstFile、FindNextFile和FindClose:-可能它们也以某种方式映射到.NET。使用它们在没有任何数据库的情况下搜索图像。从文件夹中获取一百万个文件名将花费大量时间。我建议您获取文件名并将其放入数据库。这样,你就可以在几秒钟内而不是几分钟内搜索这些名称。对于如此大量的图像,我的第一个想法是创建一个倒排列表,用作索引 如果你能够维护这个列表,它将使搜索相对快速,你就不必浏览一百万张图片,我猜这对你来说太耗时了
首先,我要寻找一些倒排列表实现。这是显而易见的,但可以想象,对于一百万张图像来说,这会非常缓慢:
public IList<string> GetMatchingImages(string path, string keyword)
{
var matches = new List<string>();
var images = System.IO.Directory.GetFiles(path);
foreach (var image in images)
{
if (image.Contains(keyword))
{
matches.Add(image);
}
}
return matches;
}
public IList GetMatchingImages(字符串路径,字符串关键字)
{
var matches=新列表();
var images=System.IO.Directory.GetFiles(路径);
foreach(图像中的var图像)
{
if(image.Contains(关键字))
{
匹配。添加(图像);
}
}
返回比赛;
}
一个简单的解决方案是一个数据库,其中存储了一个ID、路径和一个varchar(string)字段,您将在其中保留所有关键字。(为了提高效率,可以将其存储在不同的表中)
通过这种方式,您可以按文件名或与图像关联的关键字进行搜索。根据操作系统的不同,我建议您使用索引服务、Windows桌面搜索或最新版本的Windows搜索。这解决了基于关键字的文件查找问题,解决了与文件夹中文件数量有关的性能问题,具有可扩展性,并且易于扩展 位于的DSearch示例几乎完全满足您的需要,并且易于实现 例如,如果查询一百万个文件并需要将文件移动到子文件夹中以提高性能,则只需创建文件夹并移动文件即可。您不需要更改任何代码 如果需要更改关键字的应用方式,例如使用文件摘要属性的关键字,则只需更改查询 对于更高版本的操作系统,您甚至不需要安装任何软件,因为搜索功能是操作系统的一部分,可通过OleDB获得。如果您想使用高级查询语法(AQS),Microsoft提供了一个类型库来访问COM接口,从而可以轻松地生成查询索引数据库的SQL命令 老实说,所有这些关于数据库等的建议都是浪费时间
- MSDN搜索windows search位于
- 与Windows Search相关的搜索技术
- 在一个文件夹中搜索一百万个文件的速度会非常慢。(有关目录文件大小计算-如何使其更快?请参阅我在的回复。)
- 我可以在大约300000个文件的硬盘上搜索*tabcontrol.cs“在不到一秒钟的时间内,第一次查询大约需要4000ms,每次查询使用不同的搜索词,在第一次查询之后需要300-600ms
- 我刚刚从“索引服务”更新为“Windows搜索”,我可以在1.25秒内搜索超过58GB的300000个文件,搜索“filename:tabcontrol”,后续搜索需要0.13到0.26秒
- 请参阅上的DSearch示例,了解实现此功能的容易程度
- “搜索桌面”位于 在硬盘上搜索文件是一项缓慢而繁琐的操作。了解如何利用Windows桌面搜索API和数据库快速查找文件。使用Vista内置的搜索功能和Windows XP提供的搜索功能,为应用程序添加创新的新功能
如果这不起作用,那就去找更高级的解决方案。除此之外,你还可以对图像进行散列,以便检查图像是否确实存在。不要使用MD5,因为它可以为不同的文件生成相同的结果-尝试SHA1或更高版本。@Dominic:当然。你认为哪种应用程序会从中受益?@Dominic Zukiewicz:“不要使用MD5,而是使用SHA-1"?!很好,MD5是128位,SHA-1是160位,但是给SHA-1输入任何大于80字节的内容最终都会导致冲突。说SHA-1永远不会产生冲突只是愚蠢的空谈。如果你想检查数据库中是否已经存在确切的文件,哈希将有所帮助。但我是说,某些算法已经为pr所知为完全不同的文件使用相同的密钥。@Patrick-我很感激这些算法
public IList<string> GetMatchingImages(string path, string keyword)
{
var matches = new List<string>();
var images = System.IO.Directory.GetFiles(path);
foreach (var image in images)
{
if (image.Contains(keyword))
{
matches.Add(image);
}
}
return matches;
}