In my previous post, I did commented that serialization could do the trick to measure the size of a DataSet object.

I am using both BinaryFormatter and SoapFormatter this time, the code is as follows:
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.Runtime.Serialization.Formatters.Binary;
namespace ConsoleApplication1
{
class Program
{
public static int MeasureDataSetByXML(DataSet ds)
{
String firstXML = ds.GetXml();
UnicodeEncoding uniEnc = new UnicodeEncoding();
return uniEnc.GetByteCount(firstXML);
}
public static long MeasureDataSetByBinaryFormatter(DataSet ds)
{
return MeasureDataSetSerialization(ds, new BinaryFormatter());
}
public static long MeasureDataSetBySoapFormatter(DataSet ds)
{
return MeasureDataSetSerialization(ds, new SoapFormatter());
}
public static long MeasureDataSetSerialization(DataSet ds, IFormatter formatter)
{
FileInfo firstFile = new FileInfo("Test.txt");
if (firstFile.Exists)
firstFile.Delete();
FileStream firstStream = firstFile.OpenWrite();
//Try Serialize
try
{
formatter.Serialize(firstStream, ds);
firstStream.Flush();
firstStream.Close();
}
catch (Exception ex)
{
Console.WriteLine("Failed to Serialized. Reason: " + ex.Message);
}
//Refresh the FileInfo
firstFile.Refresh();
return firstFile.Length;
}
static void Main(string[] args)
{
//Prepare the Data
DataSet ds = new DataSet();
Random r = new Random();
DataTable dt = new DataTable("TestTable");
for (int i = 1; i <= 10; i++)
{
dt.Columns.Add(new DataColumn("Column_" + i.ToString()));
}
dt.AcceptChanges();
for (int i = 0; i < 10; i++)
{
DataRow dr = dt.NewRow();
foreach (DataColumn dc in dt.Columns)
{
dr[dc.ColumnName] = r.Next(int.MinValue, int.MaxValue).ToString();
}
dt.Rows.Add(dr);
}
dt.AcceptChanges();
ds.Tables.Add(dt);
DataSet firstDataSet = ds.Copy();
//Double the Size
DataTable dt2 = dt.Copy();
dt2.TableName = "TsetTable";
ds.Tables.Add(dt2);
DataSet secondDataSet = ds.Copy();
Console.WriteLine("DataSet with One Table, measure based on XML: {0} bytes", MeasureDataSetByXML(firstDataSet));
Console.WriteLine("DataSet with One Table, measure based on Binary Formatter: {0} bytes", MeasureDataSetByBinaryFormatter(firstDataSet));
Console.WriteLine("DataSet with One Table, measure based on SOAP Formatter: {0} bytes", MeasureDataSetBySoapFormatter(firstDataSet));
Console.WriteLine("DataSet with Duplicate Tables, measure based on XML: {0} bytes", MeasureDataSetByXML(secondDataSet));
Console.WriteLine("DataSet with Duplicate Tables, measure based on Binary Formatter: {0} bytes", MeasureDataSetByBinaryFormatter(secondDataSet));
Console.WriteLine("DataSet with Duplicate Tables, measure based on SOAP Formatter: {0} bytes", MeasureDataSetBySoapFormatter(secondDataSet));
Console.ReadLine();
}
}
}
/* Execution Result: (result may varies with your own run)
DataSet with One Table, measure based on XML: 8086 bytes
DataSet with One Table, measure based on Binary Formatter: 5851 bytes
DataSet with One Table, measure based on SOAP Formatter: 9064 bytes
DataSet with Duplicate Tables, measure based on XML: 16118 bytes
DataSet with Duplicate Tables, measure based on Binary Formatter: 10823 bytes
DataSet with Duplicate Tables, measure based on SOAP Formatter: 16412 bytes
*/
What do you think? Which one is the closest to the actual usage of a DataSet object?
Well, I can't say about the actual RAM usage, but if you are measuring the size of DataSet that you passed to a Web Service, my money is with MeasureDataSetBySoapFormatter
loading...
About Hardono
Incoming Search
.net, c#
