在文件中存储大量数据。什么是最高性能的选择?

时间:2010-02-07 22:03:07

标签: c# serialization

目前正在进行XML序列化,但速度非常慢。寻找一种从文件中快速保存/加载信息的方法并不真正对它在光盘上的外观感兴趣(如果有什么我希望它被遮挡,因为我不想手动编辑)。

考虑二进制格式,但我不确定它是否能够序列化可能属于自定义类型的属性等。

有什么想法吗?

4 个答案:

答案 0 :(得分:7)

您可以尝试使用Sqlite。它非常快,并且将为您提供在文件上使用SQL查询的完整数据库实现。

如果您正在考虑尝试二进制格式,我建议您先尝试一下。

可以与ORM一起使用,并且可以进行压缩和加密。

答案 1 :(得分:6)

数据究竟是什么?

使用xml,显而易见的答案是使用像GZipStream这样的smoething来压缩它 - 使它变得更小和模糊。您可以使用BinaryFormatter,但it is brittle和IMO不适合长期存储。我会说“协议缓冲区”,(也许是protobuf-net),但它取决于“自定义数据”是什么。但是如果你现在使用的是XmlSerializer,那么protobuf-net可以在没有任何变化的情况下虚拟(可能会添加一些属性) - 而且(在每种情况下我都看到过)比BinaryFormatter更小,更快。

这是陡峭的学习曲线(另见:Getting Started):

[ProtoContract]
public class Person {
    [ProtoMember(1)]
    public int Id {get;set;}

    [ProtoMember(2)]
    public string Name {get;set;}

    //...
}

公平地说,如果你使用继承,它可能会让更棘手 - 尽管不多。在许多情况下,您实际上可以使用现有属性 - 如果包含显式元素顺序,它将与xml / wcf属性一起使用。

答案 2 :(得分:1)

二进制序列化当然适用于自定义类型的属性,并且通常生成比XML序列化更小的文件。如果文件大小是影响您情况的重要因素,那么您肯定应该考虑这种方法。

答案 3 :(得分:1)

我同意Am关于使用像SQLite这样的嵌入式数据库。它带来了显着的好处。在其上层叠ORM的能力可能是最重要的。

XML序列化非常方便,特别是当您需要手动编辑XML或使用其他XML工具(如XSLT等)处理XML时,它也存在一些不可避免的性能问题。在.Net中使用XML序列化的一个重要技术是缓存XML序列化程序。或者在构建时由sgen创建它们。

缓存XML Serializer的原因与以下事实有关:如果在已加载的程序集中找不到序列化程序,.Net运行时将自动生成,编译和加载包含序列化程序的程序集。这个过程可能非常慢。构建新的XMLSerializer实例也可能非常慢。因此你应该缓存它。在缓存序列化程序时要小心,因为不同的XMLSerializer构造函数可以生成行为不同的不同序列化程序实现。特别是关于名称空间等

当然,解析大量文本通常会影响性能。不幸的是,使用XML并不容易避免。

SQLite是比XML更好的选择的原因之一是它的核心是固定长度的记录存储系统。任何具有固定长度记录的二进制文件都将快速读取,索引和扫描。固定块大小的文件格式几乎总是令人惊讶地快速读写。我建议在某个时候为你自己的教育实施一个。

如果您仍然需要基于文本的格式(为了便于互操作)并且不需要ORM的好处,那么请考虑使用FileHelpers 库。