【问题标题】:Alternatives to XMLSerializer for very large data非常大数据的 XMLSerializer 的替代品
【发布时间】:2013-10-14 17:02:08
【问题描述】:

现在我正在尝试将大量内存数据保存到我的硬盘中。它目前正在尝试使用 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();

【问题讨论】:

  • 你看过任何压缩技术吗?
  • JSON 会生成一个较小的文件。任何一种格式都可以通过压缩变得更小。序列化是否需要人类可读?
  • 在这种情况下,nosql 数据库可能是更好的选择。你也可以试试 JSON 和code.google.com/p/protobuf-net

标签: c# serialization xmlserializer


【解决方案1】:

如果你想要一个小而快的加载文件,不要使用序列化程序,而且绝对不要使用 xml。在您的类上实现仅将基本数据保存和加载到二进制流中的方法。

【讨论】:

    【解决方案2】:

    我会使用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 最小化器使其更小。

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多