【问题标题】:Memory stream for large data大数据的内存流
【发布时间】:2016-05-17 01:53:40
【问题描述】:

谁能给我一个提示:如何处理更大的数据:

using (MemoryStream ms = new MemoryStream())
{
    ser.Serialize(ms, files);
    filesBytes = ms.ToArray();
}

files 是一个自定义类型的数组,其中包含有关文件的信息

ser 是二进制格式化程序

这些对象应该被序列化

public class FileEntry
{
    public string FileName { get; set; }
    public string RelativePath { get; set; }
    public byte[] Content { get; set; }
}

【问题讨论】:

  • 你到底是什么意思?
  • 当我尝试运行此代码时,发生内存不足异常
  • 您写入流的数据有多大?您使用的是 32 位还是 64 位进程?
  • 你能显示被序列化的类型吗?你打算怎么处理那些filesBytes
  • MemoryStream 对于大文件是“安全的”。但是,您会将整个文件加载到内存中,并且它将一直保留在那里,直到垃圾收集确定是回收该内存的好时机。更多msdn.microsoft.com/en-us/library/ms733742(v=vs.110).aspx

标签: c# binary memorystream


【解决方案1】:

它分配的内存至少是序列化数据总大小的两倍。

一次用于内存流,第二次用于需要为ToArray()分配的新缓冲区

您可以使用ms.GetBuffer() 获取内部缓冲区,但请记住它很可能比实际数据大。所以需要配合ms.Length使用

如果总大小非常大,最好使用文件流并从您的方法中返回 Stream 而不是 byte[]

【讨论】:

  • 鉴于他正在序列化一个对象数组,这些对象数组已经在 byte[] 中具有文件内容,他的代码将至少 三倍 内存负载。绝对需要重构以使用底层流。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多