C#BinaryFormatter在将数据表序列化为内存流时抛出OutOfMemoryException

时间:2016-07-08 12:24:31

标签: c# datatable out-of-memory

我的DataTable中有100万条记录。我需要通过字节将此数据发送到桌面应用程序。因此,我使用BinaryFormatter来序列化DataTable。以下是我使用的代码。

        if (dt != null)// dt is the datatable with the million records
        {
            MemoryStream stream = new MemoryStream();
            System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
            formatter.Serialize(stream, dt); // here it throws exception "System.OutOfMemoryException"
            _data = stream.GetBuffer();
        }

但它会抛出 System.OutOfMemoryException 。我没有得到的是当我有足够的虚拟内存时抛出异常的原因。对于.Net 3.5而言,任何对象的大小都限制为2 GB,但不超过2 GB。

P.S 我有2 GB RAM可用,差不多有700 MB页面缓冲池。

下面是抛出异常的堆栈跟踪

   at System.Text.StringBuilder.ToString()
   at System.IO.StringWriter.ToString()
   at System.Data.DataSet.GetRemotingDiffGram(DataTable table)
   at System.Data.DataTable.SerializeDataTable(SerializationInfo info, StreamingContext context, Boolean isSingleTable, SerializationFormat remotingFormat)
   at System.Data.DataTable.GetObjectData(SerializationInfo info, StreamingContext context)
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   at System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter, SerializationBinder binder)
   at System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph)

0 个答案:

没有答案