arrays - 尝试从 Soap WebService 发送大字节 [] 时出现 OutOfMemory 异常
问题描述
我们有来自 Web 服务的以下方法,从另一个应用程序调用以检索数据:
[WebMethod]
public byte[] GetImageAsBytes(int pIdObject)
{
string pathOfImage = getImagePathBasedOnId(pIdObject);
if (File.Exists(pathOfImage))
{
byte[] result = null;
using (MemoryStream memoryStream = new MemoryStream(1))
{
using (FileStream fileStream = File.OpenRead(pathOfImage))
{
int num = -1;
if (fileStream.CanRead)
{
num = fileStream.ReadByte();
}
while (num != -1)
{
memoryStream.WriteByte(Convert.ToByte(num));
num = fileStream.ReadByte();
}
fileStream.Close();
}
result = memoryStream.ToArray();
}
return result;
}
return null;
}
这些文件有不同的大小,从 1 kb 到 30 mb。可以从 100 个不同的客户端调用此方法,或多或少在不同的时间段内调用此方法。
每次调用后内存都不会释放,在某些时候我们会得到 OutOfMemory 异常(更常见的是当它是关于一个更大的文件,20-30 mb 时)。
MemoryStream 和 FileStream 对象每次都会被释放,但这还不够。
是否有另一种方法可以从文件中返回一个 byte[] 数组,该文件最多可以有 30 MB 且内存消耗更少?
解决方案
推荐阅读
- mysql - 限制和分组?如何按国家/地区返回收入最低的 100 位客户?SQL
- automation - 如何在 Applescript 中引用辅助功能检查器描述为“<empty description> (sheet) [NSPanel]”的窗口中的对象?
- python - 我更新了我的 Anaconda 和 Jupyter 笔记本,现在输出不会显示
- reactjs - ReactTS,对 API 的 POST 请求因 415 不受支持的媒体类型而失败
- python - 漂亮汤的谷歌新闻标题标签
- python - 使用作为引用第三列复制列值
- python - 将重叠图像拼接在一起后平滑重叠图像的最佳方法?
- haskell - 如何在haskell中更改构造函数的优先级
- python - Heroku 没有检测到语言
- database - 从包含一些丢失文件的数据目录中恢复 PostgreSQL 数据