【问题标题】:Out of Memory Exception in System.Drawing.dllSystem.Drawing.dll 中的内存不足异常
【发布时间】:2017-05-03 07:57:14
【问题描述】:

我的代码是从 dll 中的 .resx 文件中加载资源。它会很好地加载资源,直到达到 40 左右,然后它开始抛出内存异常。谁能向我解释为什么会这样?还有怎么解决?

编辑:

我通过将解决方案中的所有项目更改为 64 位来解决我的问题。

谢谢

    /// <summary>
    /// Loads all default resources.
    /// </summary>
    /// <returns></returns>
    private static List<Bitmap> LoadAllInternalResources()
    {
        List<Bitmap> Ret = new List<Bitmap>();

        #region Spades

        Ret.Add(MainResources.MainResources._50);

        Ret.Add(MainResources.MainResources._46);

        Ret.Add(MainResources.MainResources._12);

        Ret.Add(MainResources.MainResources._38);

        Ret.Add(MainResources.MainResources._34);

        Ret.Add(MainResources.MainResources._30);

        Ret.Add(MainResources.MainResources._26);

        Ret.Add(MainResources.MainResources._22);

        Ret.Add(MainResources.MainResources._18);

        Ret.Add(MainResources.MainResources._14);

        Ret.Add(MainResources.MainResources._10);

        Ret.Add(MainResources.MainResources._6);

        Ret.Add(MainResources.MainResources._2);

        #endregion Spades

        #region Clubs

        Ret.Add(MainResources.MainResources._49);

        Ret.Add(MainResources.MainResources._45);

        Ret.Add(MainResources.MainResources._41);

        Ret.Add(MainResources.MainResources._37);

        Ret.Add(MainResources.MainResources._33);

        Ret.Add(MainResources.MainResources._29);

        Ret.Add(MainResources.MainResources._25);

        Ret.Add(MainResources.MainResources._21);

        Ret.Add(MainResources.MainResources._17);

        Ret.Add(MainResources.MainResources._13);

        Ret.Add(MainResources.MainResources._9);

        Ret.Add(MainResources.MainResources._5);

        Ret.Add(MainResources.MainResources._1);

        #endregion Clubs

        #region Hearts

        Ret.Add(MainResources.MainResources._51);

        Ret.Add(MainResources.MainResources._47);

        Ret.Add(MainResources.MainResources._43);

        Ret.Add(MainResources.MainResources._39);

        Ret.Add(MainResources.MainResources._35);

        Ret.Add(MainResources.MainResources._31);

        Ret.Add(MainResources.MainResources._27);

        Ret.Add(MainResources.MainResources._23);

        Ret.Add(MainResources.MainResources._19);

        Ret.Add(MainResources.MainResources._15);

        Ret.Add(MainResources.MainResources._11);

        Ret.Add(MainResources.MainResources._7);

        Ret.Add(MainResources.MainResources._3);

        #endregion Hearts

        #region Diamonds

        Ret.Add(MainResources.MainResources._52);

        Ret.Add(MainResources.MainResources._48);

        Ret.Add(MainResources.MainResources._44);

        Ret.Add(MainResources.MainResources._40);

        Ret.Add(MainResources.MainResources._36);

        Ret.Add(MainResources.MainResources._32);

        Ret.Add(MainResources.MainResources._28);

        Ret.Add(MainResources.MainResources._24);

        Ret.Add(MainResources.MainResources._20);

        Ret.Add(MainResources.MainResources._16);

        Ret.Add(MainResources.MainResources._12);

        Ret.Add(MainResources.MainResources._8);

        Ret.Add(MainResources.MainResources._4);

        #endregion Diamonds

        #region Jokers

        Ret.Add(MainResources.MainResources._54);

        Ret.Add(MainResources.MainResources._53);

        #endregion Jokers

        return Ret;
    }

【问题讨论】:

  • 图片有多大?曾经有一组非常好的 72x96 卡可以轻松加载到 ImageList 或从磁盘 v 中。该网站已消失,但我确信有人将其缓存/镜像到某处
  • 图片非常大,每张大约 365K。我猜我可能会达到 32x 程序允许的最大内存量。会检查的。

标签: c# .net memory bitmap resources


【解决方案1】:

您的机器没有足够的内存来加载所有这些位图。您需要同时加载它们吗?

这里有一些解决问题的方法:

  1. 可能在需要时加载它们并在不需要它们时丢弃它们。一次做几个项目。 File.ReadLines 使用类似的方法。它返回一个IEnumberable,当您遍历它时,它一次读取一行。 File.ReadAllLines 会将整个文件读入内存。所以如果你有一个 4GB 的文件并且每行是 50KB,File.ReadLines 将一次读取 50KB。 File.ReadAllLines 会将整个 4GB 读入内存。 (这些数字是任意选择的)。因此,在 32 位机器上,File.ReadAllLines 会导致内存不足异常,但 File.ReadLines 可能不会,只要您不在整个枚举器上调用 ToList()
  2. 您可能需要缩略图,以便可以加载更多缩略图,然后在需要高质量图片时加载实际图像。
  3. 增加计算机上的 RAM。 (虽然这不是我推荐的解决方案)。

【讨论】:

  • 我的机器上有 RAM 来加载资源。这与我的程序有关。
  • 是的,它确实与您的程序有关,这就是我所说的。这些位图有多大,你有多少 RAM?
【解决方案2】:

要解决我的问题,我只需将项目设置更改为 64 位,而不是 32 位。

【讨论】:

  • 这并没有解决问题,而是避免处理它。
猜你喜欢
  • 2013-03-07
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多