【问题标题】:Out Of Memory when loading many pictures in High-Load在高负载下加载许多图片时内存不足
【发布时间】: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


【解决方案1】:

尝试从文件夹中的每个文件名创建System.Drawing.Bitmap 对象的集合,然后使用GetPixel(int x, int y) 方法一次比较每两个对象,其中x 和y 是要检索的像素的坐标。这种方式将帮助您找到双打。这篇小文章可能符合你的预期:

Image Comparison using C#

如果您正在处理多个图像文件,请考虑在使用后释放位图资源。

【讨论】:

  • 不幸的是,它在创建集合时仍然抛出 OutOfMemory,我认为这与我正在加载这么多图像的事实有关。我尝试将它们调整为 16x16,但它并没有使它有任何不同。在相同数量的负载后崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
相关资源
最近更新 更多