【问题标题】:How to avoid and predict Out of Memory Exception如何避免和预测内存不足异常
【发布时间】:2011-10-24 14:38:43
【问题描述】:

所以,如果我有一个List<Bitmap> myBitmaps,我应该在其中存储大量来自数据库的位图令牌,并且它可能会出现内存不足异常,我该如何避免这种情况。

我应该将一堆图像存储在硬盘驱动器上,而不是在第一束处理后加载另一个图像等等。

另一种情况是,如果我加载 Base64 并针对大量数据编码为 String 和 String 到 Base64,我如何才能在不导致 Out of Memory Exception 的情况下实现它,以及如何预测是否会出现 Out of两种情况下的内存异常。

PS:如果有人提供解决方案,请解释它是否会降低性能以及原因。

【问题讨论】:

  • 什么是“内存超出范围异常”?你的意思是OutOfMemoryException 还是IndexOutOfRangeException?它们完全不同。
  • @svick 更新了内存不足异常我很抱歉不匹配
  • 为什么你有大量使用 Base64 编码的数据?这可能不是一个好主意。
  • 另外,这两个问题似乎完全不相关。你应该一次只问一个问题。

标签: c# performance algorithm memory


【解决方案1】:

从它的声音来看,Bitmaps 似乎很大,将它们全部存储在内存中是不切实际的。如果您正在对其进行批量操作,那么交换到磁盘肯定会导致性能下降,但鉴于在现实世界中您正在使用硬件限制,因此没有选择。

您也许可以在内存中缓存有关位图的某些元数据以加速操作。另一种选择是将整个位图缓存在内存中,并在核心内存中没有数据时转到磁盘。

您缓存的具体内容将再次取决于使用模式。也可以考虑使用WeakReference

大数据的 Base64 转换可以轻松转换为 online algorithm,一次转换少量数据。

【讨论】:

    【解决方案2】:

    我更愿意在数据库中存储这样(可能的)大量数据。数据库的性能取决于数据库、硬件和与数据库的连接。

    【讨论】:

    • 是的,你喜欢,我喜欢,但我有需要将大量数据加载到 List 中的情况。
    • @Cody:然后你在 try catch 块中处理 OutOfMemoryException,不是吗?
    • 问题没那么简单;)
    【解决方案3】:

    如果位图太大,您可以一张一张地加载它们。每次只加载一个位图,处理它,不要忘记Dispose()它然后继续另一个位图。

    如果执行大量这样的 SQL 查询对您有所帮助,请以 N 为一组加载和处理位图(其中 N 取决于您的具体情况)。无需将它们保存到磁盘,这就是数据库的用途。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-13
      • 2020-03-26
      相关资源
      最近更新 更多