用于超大数据的 XMLSerializer 的替代方案
本文关键字:方案 XMLSerializer 用于 数据 | 更新日期: 2023-09-27 18:35:14
现在我正在尝试将大量内存数据保存到我的硬盘驱动器中。 它当前尝试使用 XMLSerializer 保存一个包含 400,000 条记录的表。 这工作正常,但 xml 文件的大小超过 1 gig。 我所有的类都实现[Serializable()]。在序列化之前,我的数据位于并发队列中<>我将其强制转换为 List。
我的问题是:是否有更好、更快的序列化程序可以创建更小的文件? 较小的文件是我想要的最重要的东西。
编辑:该文件不需要是人类可读的。 目标是能够以最小的占用空间和最快的速度将数十万条记录保存到磁盘。 我正在研究二进制序列化,但在出现"内存系统"错误时遇到问题。 我正在尝试查看是否有办法直接写入我的磁盘,而无需先将所有数据加载到内存中。 内存映射文件可能是一个选项。
我还可以选择使用 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();
如果你想要一个小的、快速加载的文件,不要使用序列化程序,绝对不要使用 XML。在类上实现仅将基本数据保存和加载到二进制流的方法。
我会使用 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最小化器使其更小。