【问题标题】:Getting OutOfMemory Exception while converting tif file into base64 encoding将 tif 文件转换为 base64 编码时出现 OutOfMemory 异常
【发布时间】:2020-11-27 21:12:03
【问题描述】:

我们在 C# 中创建了控制台应用程序,它将读取多页 tif/tiff 文件,分页然后转换为 base64 编码以将文件上传到其他目标应用程序(因为它只接受 base64 编码来上传文件)并且每当文件大小超过 500 MB 时,我们都会收到此内存不足异常。引发“System.OutOfMemoryException”类型的异常

Exception at System.Convert.ToBase64String(Byte[] inArray, Int32 offset, Int32 length, Base64FormattingOptions options)
   at System.Convert.ToBase64String(Byte[] inArray)

代码片段:

Byte[] bytes = File.ReadAllBytes(filepath);
String base64stringofdocument = Convert.ToBase64String(bytes);

上面的文件路径是指>文件的绝对路径

【问题讨论】:

  • 您可能需要做一些memory usage analysis with Visual Studio 才能找到问题的根本原因。
  • .NET 中单个字符串对象的长度不能超过 2^31-1 个字符。 Base64 编码占用相对于输入大小至少 4/3 的空间。这为您提供了大约 805MB 的理论文件大小上限,尽管实际上它可能更低。您可能希望在转换为 base64 之前压缩输入
  • 您是否考虑过将数据流式传输而不是将整个文件读入内存?
  • Project > Properties > Build 选项卡,取消勾选“Prefer 32-bit”复选框。你不喜欢它。
  • @Charleh 只需参考上面的代码 sn-p,在传递到 base64 编码之前从文件转换为字节数组。如何改善这一点?请帮助我们

标签: c# out-of-memory tobase64string large-file-upload


【解决方案1】:

使用字符串会产生开销。对于非常大量的数据,最好使用数组或流。在这种情况下,您可以首先重写代码以使用Convert.ToBase64CharArray。所以你的代码会变成这样:

Byte[] bytes = File.ReadAllBytes(filePath);
// Compute the number of Base64 converted characters required (must be divisible by 4)
long charsRequired = (long)((4.0d/3.0d) * bytes.Length);
if (charsRequired % 4 != 0) {
    charsRequired += 4 - charsRequired % 4;
}
// Allocate buffer for characters, and write converted data into the array
Char[] chars = new Char[charsRequired];
Convert.ToBase64CharArray(bytes, 0, bytes.Length, chars, 0);

然后您可以将chars 数组上传到您的目标应用程序。

【讨论】:

  • 嗨 Jack,尝试了上述建议,但如果将 char 数组再次转换为字符串对象,则可能会出现同样的问题,因为目标应用程序仅接受字符串对象用于上传文档。有没有更好的方法来处理大文件。请分享代码sn-p。
  • @Sheik 您的目标应用程序似乎不太可能只接受 .NET 字符串。如果您编辑帖子以包含用于上传到目标应用程序的代码,则可以进一步评论。
  • 在上述代码行之后,我们只需将编码后的base64字符串传递给目标应用程序的Webservice调用。这一步之后就没什么了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多