我目前正在使用CF.NET在Windows Mobile中编写一个小应用程序。
该应用程序的行为与电子邮件应用程序非常相似,即我使用POP3从我的邮件服务器帐户下载邮件和附件,以存储在存储卡上,以便使用MIME工具进行进一步处理。 / p>
我的问题是下载大型附件,因为在某个时刻我得到一个OutOfMemory异常。我通过阅读前几天here on SO发表的以下问题和答案,找到了一些有趣的事情。由于我的附件可达4-5MB(mp3歌曲),我意识到我有严重的问题。然而,同时Pocket Outlook能够下载高达4-5MB的mp3歌曲而没有任何问题(使用WIFI连接)所以必须有办法实现它!
目前,我将下载缓冲区(转换为字符串)保存为一个简单的字符串变量。我尝试将缓冲区的内容添加到stringbuilder中,但我仍然得到OutOfMemory-exceptions。
我可以采取什么策略/技术来克服这个问题?
答案 0 :(得分:10)
每当您处理大量数据时,您都希望确保不会立即将整个内容保存在内存中。
您下载的管道是一个流,因此您可以以块的形式加载数据。将文件写入磁盘时,您有一个流,因此您可以一次写入一个块。
考虑将拖拉机拖车卸入仓库。使用你的stringbuilder解决方案,你基本上会说,“我将站在预告片的后面,我希望你把拖车的全部内容装到我的怀里,然后我会把它带进仓库” 。你会受到负荷的压迫!你想要的是,“把我交给我,实际上可以随身携带,然后我将它带入仓库,然后再回来进行下一次加载”。