【发布时间】:2010-06-16 08:35:22
【问题描述】:
我们有一个图像文件夹,其中包含大约一百万张图像。 我们需要编写一个程序,该程序将根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 否
【问题讨论】:
-
这是桌面应用还是网络应用?
我们有一个图像文件夹,其中包含大约一百万张图像。 我们需要编写一个程序,该程序将根据用户输入的关键字获取图像。 我们需要在搜索时匹配文件名以找到正确的图像。 寻找任何建议。 谢谢 否
【问题讨论】:
将图像保存在单独的站点或子域中。当然,您可能不希望将所有 1M 文件放在一个目录中。
您需要一个包含(至少)三个表的数据库:
【讨论】:
根据操作系统,我建议您使用索引服务、Windows 桌面搜索或最新版本的 Windows 搜索。这解决了您基于关键字查找文件的问题,它解决了与文件夹中文件数量有关的性能问题,它具有可扩展性,并且易于扩展。
http://msdn.microsoft.com/en-us/library/dd940335(VS.85).aspx 的 DSearch 示例几乎完全符合您的要求,并且易于实施。
例如,如果查询一百万个文件并且需要将文件移动到子文件夹以提高性能,那么您可以简单地创建文件夹并移动文件。您无需更改任何代码。
如果您需要更改关键字的应用方式,例如使用文件摘要属性的关键字,则只需更改查询即可。
对于以后的操作系统,您甚至不需要安装任何软件,因为搜索功能是操作系统的一部分,可通过 OleDB 获得。如果您想使用 高级查询语法 (AQS),Microsoft 提供了一个类型库来访问 COM 接口,从而可以轻松生成 SQL 命令来查询索引数据库。
老实说,所有这些关于数据库等的其他建议都是浪费时间。
MSDN 搜索 windows 搜索 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-600 毫秒之后。
请参阅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 XP 的搜索功能为您的应用程序添加创新的新功能。
【讨论】:
将所有(图像和关键字)存储在数据库中。
您可以使用全文索引来搜索单词,或将每个单词存储为单独的条目。
而且您可以更快地访问元数据(文件名、创建日期等),而无需检索(或打开)图像本身。
这可能比依赖一个文件系统要快得多,而不是在一个文件夹中存储一百万个条目。
【讨论】:
这是显而易见的,但可以想象一百万张图片会很慢:
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;
}
【讨论】:
从文件夹中获取一百万个文件名将花费大量时间。我建议您获取文件名并将它们放入数据库中。这样您就可以在几秒钟内而不是几分钟内搜索名称。
【讨论】:
有 Win32 API FindFirstFile、FindNextFile、FindClose:http://msdn.microsoft.com/en-us/library/aa364418(VS.85).aspx - 可能它们也以某种方式映射到 .NET。使用它们在没有任何数据库的情况下搜索图像。
【讨论】:
对于如此大量的图像,我的第一个想法是创建一个倒排列表用作索引。
如果您能够维护此列表,那么搜索速度会相对较快,并且您不必搜索一百万张图片,我猜这对您来说太耗时了。
我会先寻找一些倒排列表的实现。
【讨论】:
一个简单的解决方案是一个数据库,您可以在其中存储一个 ID、路径和一个 varchar(字符串)字段,您将在其中保存所有关键字。 (为了提高效率,可以将其存储在不同的表中)
这样您就可以按文件名或与图像关联的关键字进行搜索。
【讨论】:
只需将所有图像重命名为由空格分隔的相应关键字即可。然后使用操作系统自带的搜索功能。
如果这不起作用,那么只有寻找更好的解决方案。
【讨论】: