我一直保持着大量的數據在一個文本文件中的文本記錄:爲什麼二進制文件與文本相比差別很大?
yyyyMMddTHHmmssfff doube1 double2
然而,當我讀它,我需要分析每個日期時間。這對於數百萬條記錄來說非常緩慢。
所以,現在我正在嘗試它作爲我通過serlializing我的類創建的二進制文件。
這樣我就不需要解析DateTime了。
class MyRecord
{
DateTime DT;
double Price1;
double Price2;
}
public byte[] SerializeToByteArray()
{
var bf = new BinaryFormatter();
using (var ms = new MemoryStream())
{
bf.Serialize(ms, this);
return ms.ToArray();
}
}
MyRecord mr = new MyRecord();
outBin = new BinaryWriter(File.Create(binFileName, 2048, FileOptions.None));
for (AllRecords) //Pseudo
{
mr = new MyRecord(); //Pseudo
outBin.Write(mr.SerializeToByteArray());
}
生成的二進制文件的平均大小是TEXT文件大小的3倍。
這是預期的嗎?
編輯1
我使用Protbuf幫我探索:
我想用使用,以適應我現有的結構做到這一點。
private void DisplayBtn_Click(object sender, EventArgs e)
{
string fileName = dbDirectory + @"\nAD20120101.dat";
FileStream fs = File.OpenRead(fileName);
MyRecord tr;
while (fs.CanRead)
{
tr = Serializer.Deserialize<MyRecord>(fs);
Console.WriteLine("> "+ tr.ToString());
}
}
但在第一次記錄tr - 滿零之後。
默認串行輸出很大的開銷。如果你手動將你的東西寫入二進制編寫器,你會少得多。 – harold
這不僅僅是一個「二進制文件」,它是「一個使用BinaryFormatter的二進制文件」 - 並且每個記錄都有一個新的BinaryFormatter,這會增加額外的開銷。這就是原因。 –
這與二進制文件本身無關。這是'BinaryFormatter'特有的。其他二進制格式將是有效的。 – CodesInChaos