【发布时间】:2015-08-22 00:02:01
【问题描述】:
我是编程的初学者,对于第一个“更难”的项目,我选择制作一个工具来搜索我的图片集中的替身。
我的第一个想法是使用哈希,所以我想出了这个:
var files = Directory.GetFiles("T:Obrazki", "*.jpg");
foreach (var item in files)
{
var m = Image.FromFile(item);
Console.WriteLine(m.GetHashCode());
}
它开始很好,然后给出了 System.OutOfMemoryException。
我尝试了很多方法,包括将循环分成 2 个 for 循环,但没有任何效果。接下来我在网上找到了一条将目标平台更改为 x64 的建议,但没有任何帮助。
我尝试的最后一件事是在循环的每次迭代中处理“m”并手动添加 GC.Collect:
var files = Directory.GetFiles("T:Obrazki", "*.jpg");
foreach (var item in files)
{
var m = Image.FromFile(item);
Console.WriteLine(m.GetHashCode());
m.Dispose();
GC.Collect();
}
它也没有工作。 它在 +/- 180 张图像后崩溃。 你有什么想法吗?
【问题讨论】:
-
我不知道这是否是最好的方法,但是您可以从每个文件中读取前 x 个字节数(不要将其视为图像),然后比较它们,仅当您找到匹配项是否增加了您抓取的字节数。你应该从多少字节开始?我不确定,调整它以使其准确,但尽量保持小
-
看看这个问题。我认为问题可能是它。使用 Directory.EnumerateFiles stackoverflow.com/questions/1970603/…
-
@SteveG 会很慢。
-
@user1551066 问题显然是在
var m = Image.FromFile(item);中创建新位图。从那里抛出异常。
标签: c# image out-of-memory