【发布时间】:2014-06-20 08:40:12
【问题描述】:
我的软件有一项功能,允许用户上传以字节字符串形式存储在我的数据库中的文件。
代码是这样工作的:
计算文件中的字节数,并创建一个具有该长度的字节数组。然后将文件读入字节数组。从这里,文件被分成几部分并存储在我的数据库中。这是通过使用以下代码完成的:
openFile1 = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
blah, blah, blah
.
.
.
openFileBytesNumber = openFile1.Length;
byteArray = new byte[openFileBytesNumber];
openFile1.Read(byteArray, 0, (int)(openFileBytesNumber));
fullByteString = Convert.ToBase64String(byteArray);
当我下载它时,会发生以下情况:
通过从数据库加载文件数据并连接所有片段来创建一个字节字符串。使用以下代码行将字符串放入字节数组中:
byteArray = Convert.FromBase64String(byteString.ToString());
这是我得到内存不足异常的地方。为什么我在下载时收到 OutOfMemoryException,但在上传时却没有?
【问题讨论】:
-
什么是
byteString以及如何连接这些片段? -
.NET 需要分配一个连续的内存块。如果文件很大,可能是因为它没有为第二次分配找到足够的连续内存。将文件存储为 Base64 字符串非常浪费。它应该存储在二进制列中。
-
@Guffa, StringBuilder byteString = new StringBuilder(); for (int i = 0; i
-
为什么我在下载时收到 OutOfMemoryException,但在上传时却没有?您的意思是您总是收到 OOM 错误,无论如何文件大小? 我们在这里谈论的是什么尺寸?
-
@SeanSmyth 你能把 byteString 分解成块并以这种方式解码吗?你有什么理由需要记忆中的全部内容? (换句话说,不要组装,只需一次解码。)
标签: c# .net file exception out-of-memory