【问题标题】:SQL CE OutOfMemoryException consuming web serviceSQL CE OutOfMemoryException 使用 Web 服务
【发布时间】:2010-10-14 23:36:30
【问题描述】:

在尝试通过 Web 服务下载文档时,我们不断收到 OutOfMemory 异常。我们将文档字节数组数据存储为序列化消息对象的一部分,原始文档的大小均约为 500kb。消息对象图中唯一的另一件事是用于关联的两个字符串属性。

我们已尝试检索具有相同问题的压缩和未压缩文档。现在我相信在尝试反序列化消息而不是在下载流时引发了异常。

我知道这是一个模糊的问题,但是你们中的任何人都知道是什么原因造成的吗?此处传输的数据量似乎很小,传输时设备上几乎没有发生其他任何事情。

【问题讨论】:

    标签: web-services windows-mobile windows-ce


    【解决方案1】:

    Windows Mobile 设备上的内存非常紧张——使用它确实是一个痛苦的世界。首先,一个进程的总内存是(如果我没记错的话)32 MB。现在,它不仅被代码内内存分配填满,而且还被从 DLL、EXE 等加载的代码填满。

    现在,当您将 500KB 下载到字节数组中时,它不仅需要 500KB。它需要 500KB 的 CONTIGUOUS MEMORY,一旦应用运行了一小段时间,它就不太可能找到。

    我的建议是直接使用 HttpRequest 而不是 Web 服务下载文件。也许网络服务可以传回您需要的 URL 或类似的东西。但是直接下载文件,你可以分块处理它——读取 8K,然后将 8K 写入磁盘,然后读取另一个 8K,等等。

    【讨论】:

    • 感谢您的建议,非常有帮助。有什么方法可以增加 Per-Process 的内存分配?
    • 不,很遗憾没有。至少在我有经验的 Windows Mobile 5.0 中没有。您只需要以一种不需要一次性大量内存的方式来构建您的应用程序。实际上,要尝试的另一件事是在应用程序开始时分配一个大字节数组......
    • ...等等,没关系。如果您正在进行 Web 服务调用,我认为您不能使用“ref byte [] 缓冲区”。它总是创建自己的。
    【解决方案2】:

    为了获得 OutOfMemory 异常,代码要么存在消耗内存直到设备没有更多内存的错误,要么设备通常没有足够的内存来处理甚至 500Kb 的变化。

    您说“在尝试下载文档时”也许您将它们保存在内存中并且您得到了异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      相关资源
      最近更新 更多