我们有一个图片文件夹,里面有大约一百万张图片。 我们需要编写一个程序,根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 Ñ
答案 0 :(得分:4)
将图片保存在单独的网站或子域中。当然,您可能不希望所有1M文件都在一个目录中。
您需要一个包含(至少)三个表的数据库:
ImageFile ID Filepath Keyword ID theWord ImageKeyword ImageID KeywordID
答案 1 :(得分:2)
将所有(图片和关键字)存储在数据库中。
您可以使用全文索引搜索单词,或将每个单词存储为单独的条目。
您可以更快地访问元数据(文件名,创建日期等),而无需检索(或打开)图像本身。
这可能要快得多,因为依赖的文件系统不能在一个文件夹中存储一百万个条目。
答案 2 :(得分:2)
这是显而易见的,但可以想象,对于一百万张图像来说,它会非常慢:
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;
}
答案 3 :(得分:2)
根据操作系统的不同,我建议您使用索引服务,Windows桌面搜索或最新版本的Windows搜索。这解决了基于关键字的文件查找问题,它解决了文件夹中文件数量方面的性能问题,可扩展,并且可以轻松扩展。
http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspx上的 DSearch 示例几乎完全符合您的要求并且易于实现。
例如,如果查询一百万个文件并需要将文件移动到子文件夹中以提高性能,那么您只需创建文件夹并移动文件即可。您无需更改任何代码。
如果您需要更改关键字的应用方式,例如使用文件摘要属性的关键字,则只需更改查询。
对于以后的操作系统,您甚至不需要安装任何软件,因为搜索功能是操作系统的一部分,可通过OleDB获得。如果要使用高级查询语法(AQS),Microsoft提供了一个类型库来访问COM接口,以便轻松生成用于查询索引数据库的SQL命令。
老实说,关于数据库的所有其他建议等等都是浪费时间。
在http://social.msdn.microsoft.com/Search/en-US?query=windows+search
相关搜索技术到 Windows搜索 http://msdn.microsoft.com/en-us/library/bb286798(VS.85).aspx
在一个文件夹中搜索一百万个文件将会非常缓慢。(请参阅我在Directory file size calculation - how to make it faster?的回复,了解目录文件大小计算 - 如何制作快?
我可以在不到一秒的时间内搜索我的硬盘驱动器~300,000个文件* tabcontrol.cs“第一个查询需要大约4000毫秒,每个查询使用不同的搜索词,在第一个查询占用300之后-600ms。
请参阅http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspx处的 DSearch 示例,了解实施此操作的难易程度。
在http://blogs.msdn.com/b/coding4fun/archive/2007/01/05/1417884.aspx
上搜索“桌面”在硬盘驱动器上搜索文件是一项缓慢而乏味的操作。了解如何利用Windows桌面搜索API和数据库快速查找文件。使用Vista内置的搜索功能为Windows应用程序添加创新的新功能。
答案 4 :(得分:1)
从文件夹中获取一百万个文件名将花费大量时间。我建议你获取文件名并将它们放在数据库中。这样您就可以在几秒钟内而不是几分钟内搜索名称。
答案 5 :(得分:0)
Win32 API FindFirstFile,FindNextFile,FindClose:http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx - 可能它们也以某种方式映射到.NET。使用它们搜索没有任何数据库的图像。
答案 6 :(得分:0)
我对如此大量图片的第一个想法是创建一个反向列表以用作索引。
如果你能够维护这个列表,它会使搜索速度相对较快,你不必搜索一百万张图片,而我猜这些图片对你来说太费时了。
我首先要寻找一些反向列表实现。
答案 7 :(得分:0)
一个简单的解决方案是一个数据库,您可以在其中存储ID,路径和varchar(字符串)字段,您可以在其中保留所有关键字。 (为了提高效率,可以存储在不同的表中)
通过这种方式,您可以按文件名或与图片相关联的关键字进行搜索。
答案 8 :(得分:0)
只需将所有图片重命名为各自由空格分隔的关键字即可。然后使用操作系统自己的搜索功能。
如果这不起作用,那么只有寻找更好的解决方案。