【发布时间】:2018-09-10 14:27:18
【问题描述】:
我已经实现了 POC 将整个文件内容读入 Byte[] 数组。我现在成功读取了大小低于 100MB 的文件,当我加载大小超过 100MB 的文件时,它会抛出
Convert.ToBase64String(mybytearray) 无法获取 局部变量或参数,因为没有足够的内存 可用。
以下是我尝试将内容从文件读取到字节数组的代码
var sFile = fileName;
var mybytearray = File.ReadAllBytes(sFile);
var binaryModel = new BinaryModel
{
fileName = binaryFile.FileName,
binaryData = Convert.ToBase64String(mybytearray),
filePath = string.Empty
};
我的模型类如下
public class BinaryModel
{
public string fileName { get; set; }
public string binaryData { get; set; }
public string filePath { get; set; }
}
我收到“Convert.ToBase64String(mybytearray) 无法获取局部变量或参数的值,因为没有足够的可用内存。” Convert.ToBase64String(mybytearray) 处出现此错误。
我需要注意什么以防止出现此错误吗?
注意:我不想在我的文件内容中添加换行符
【问题讨论】:
-
在通常情况下,加载和编码 100mb 根本不会引起任何问题,还有其他事情发生 - 我认为您需要添加更多细节,包括完整的堆栈跟踪和异常消息,有你发布的那个没有谷歌点击。
-
默认情况下,对象的最大大小为 2GB,这可能就像 @AlexK 所说的那样。问题不在于 100MB 数组的声明
-
我认为这将是非常不可行的。你最大的文件有多大?例如,如果您有一个 500 MB 的文件,您正在谈论的字符串长度约为 699,050,660 个字符。因为每个字符是 2 个字节,所以你说 1.3 GB 的内存只是为了保存这个字符串。
-
@AlexK。 - 这不是文件的数组,我猜问题在于将二进制流转换为 Base64 编码的字符串。该比率基本上是“数组”长度的 8/6 或大约 1.3 增加,但请记住,由于这些现在是数组中的
chars,我们将数据要求加倍。所以一个 500 MB 的文件变成了一个 1.3 GB 的字符串数组。一个 200 MB 的文件将是一个大约 530 MB 的字符串。 -
@Vijay - 您是否可以将其作为流执行,读取并将其写入文件或其他内容,或者您是否需要将该字符串保存在内存中(作为@987654324 的一部分@)。我认为没有任何方法可以让您将整个字符串保存在内存中。正如您从建议的答案中看到的那样,每个答案都显示将此数据直接写回文件。
标签: c# base64 filereader