2014-04-02 52 views
0

我一直保持着大量的數據在一個文本文件中的文本記錄:爲什麼二進制文件與文本相比差別很大?

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 - 滿零之後。

+0

默認串行輸出很大的開銷。如果你手動將你的東西寫入二進制編寫器,你會少得多。 – harold

+0

這不僅僅是一個「二進制文件」,它是「一個使用BinaryFormatter的二進制文件」 - 並且每個記錄都有一個新的BinaryFormatter,這會增加額外的開銷。這就是原因。 –

+0

這與二進制文件本身無關。這是'BinaryFormatter'特有的。其他二進制格式將是有效的。 – CodesInChaos

回答

1

您的存檔可能在每條記錄中有相當多的開銷序列化類型信息。

取而代之的是,使整個集合可序列化(如果它尚未),並一次性序列化。

0

您沒有存儲DateTime的簡單二進制版本,而是存儲表示這些的對象。這比將文本存儲爲日期要大得多。

如果你創建一個類

class MyRecords 
{ 
    DateTime[] DT; 
    double[] Price1; 
    double[] Price2; 
} 

和序列化的是,它應該是小得多。

另外我想DateTime仍然需要大量的空間,所以你可以將你的DateTime轉換爲Integer Unix時間戳並存儲它。

0

按OP要求。

輸出不是一個二進制文件它的實例的二進制序列加的BinaryFormatter的開銷,讓反序列化後出於這個原因,你得到3倍於預期 如果你需要一個聰明的系列化解決方案,您可以看看文件大在protobuf網https://code.google.com/p/protobuf-net/

here,你可以找到一個鏈接,說明您是如何做到這一點

[ProtoContract] 
Public class MyRecord 
    { [ProtoMember(1)] 
      DateTime DT; 
     [ProtoMember(2)] 
      double Price1; 
      [ProtoMember(3)] 
      double Price2; 
    } 
+0

你可以展示如何反序列化而不使用USING。請參閱我的編輯1 – ManInMoon

+0

我看不到任何編輯 –

+0

對不起 - 忘了來拯救他們! – ManInMoon

相關問題