2013-10-14 53 views
0

現在我正嘗試將大量內存數據保存到我的硬盤中。它目前正嘗試使用XMLSerializer保存一個包含400,000條記錄的表。這工作正常,但xml文件的大小超過1演出。我所有的類都實現了[Serializable()]。我的數據處於併發隊列中,我在序列化之前將其列入列表<>。用於非常大型數據的XMLSerializer的替代品

我的問題是:是否有更好,更快的序列化程序,將創建更小的文件?較小的文件是我想要的最重要的東西。

編輯:該文件不需要是人類可讀的。我們的目標是能夠以最小的佔地面積和最快的速度將數十萬條記錄保存到磁盤中。我正在研究Binary Serialization,但是在獲取「內存系統」錯誤方面存在問題。我試圖查看是否有辦法直接寫入我的磁盤,而無需首先將所有數據加載到內存中。內存映射文件可能是一個選項。

我也可以選擇使用sql server 2008進行存儲。如果應用程序訪問數據庫並將文件存儲在計算機中(如果不存在),我計劃將其用作輔助存儲單元。

 var xml = new XmlSerializer(typeof(List<pPeople>)); 
     FileStream fs = new FileStream(@"C:\Users\...\Desktop\TestLogFile.xml", FileMode.Create); 
     TextWriter tw = new StreamWriter(fs); 
     xml.Serialize(tw, peoplePeople.ToList<pPeople>()); 
     tw.Close(); 
     fs.Close(); 

     //Deserialize 
     FileStream openFS = new FileStream(@"C:\Users\...\Desktop\TestLogFile.xml", FileMode.Open); 
     var savedPeople = (List<pPeople>)xml.Deserialize(openFS); 
     peoplePeople = (ConcurrentQueue<pPeople>)savedPeople.Cast<ConcurrentQueue<pPeople>>(); 
     openFS.Close(); 
+0

你看過任何壓縮技術嗎? –

+0

'JSON'會產生一個較小的文件。而壓縮格式可以變得更小。序列化是否需要人類可讀? – Sorax

+0

在這種情況下,可能nosql數據庫將是更好的選擇。您也可以嘗試使用JSON和http://code.google.com/p/protobuf-net/。 –

回答

1

如果你想要一個小的,快速加載文件,不要使用序列化程序,並且絕對不要使用xml。在您的類上實現方法可節省&僅將基本數據加載到二進制流。

-1

我會使用JSON.NET而不是XML。 .NET產生較小的文件,它將比XML更快地被解析。但是,如果您要使用XSLT將XML轉換爲其他任何內容,我建議您使用XML。以下是一些示例:

Product product = new Product(); 
product.Name = "Apple"; 
product.Expiry = new DateTime(2008, 12, 28); 
product.Sizes = new string[] { "Small" }; 

string json = JsonConvert.SerializeObject(product); 
//{ 
// "Name": "Apple", 
// "Expiry": "2008-12-28T00:00:00", 
// "Sizes": [ 
// "Small" 
// ] 
//} 

正如您所看到的,它不像XML那樣冗長。然後,你可以使用JavaScript最小化,使其更小。