使用protobuf-net进行质量过滤

时间:2011-02-14 19:09:07

标签: c# .net protobuf-net

我用protobuf-net序列化了一个对象列表。

理论上,.bin文件可以包含数百万个对象。

假设对象属于包含以下内容的类:

public string EventName;

我必须进行查询并创建一个包含与查询匹配的对象的列表。 使用LINQ从序列化文件中提取匹配对象的正确方法是什么?

4 个答案:

答案 0 :(得分:5)

protobuf格式是项目的线性序列;任何索引等你只能单独申请。但是,IEnumerable<T>可用;你可能会发现:

var item = Serializer.DeserializeItems<YourType>(source)
       .First(item => item.Id == id);

做得很好;这样:

  • 懒洋洋地假装;每个项目都是单独产生的,所以你不需要大量的内存
  • 短路;如果在开始附近找到该项目,它将立即退出

或多件物品:

var list = Serializer.DeserializeItems<YourType>(source)
    .Where(item => item.Foo == foo);

(如果你想缓冲内存中的匹配项,可以在上面添加一个ToList,如果你只想以一个前向方式解析它,可以在没有ToList的情况下使用)

答案 1 :(得分:1)

如果您想在所选元素列表上添加一些投影,您应该尝试使用我的库https://github.com/Scooletz/protobuf-linq。它们也可以在NuGet上使用。 该库大大降低了反序列化的开销。在某些情况下,它可以降至原始查询的50%。

答案 2 :(得分:0)

不幸的是,没有一个。要使用LINQ,您的对象必须实现IQueryable<T>IEnumerable<T>。除非有一个LINQ提供程序可以在.bin文件中提供IQueryable<T>接口,否则你必须:

  • 将文件反序列化到内存中并使用LINQ-to-objects IEnumerable<T>
  • 编写可以提供IQueryable<T>的LINQ提供程序(如果您的文件是巨大的,这可能是唯一可行的选项),可以处理文件而不加载整个文件。

答案 3 :(得分:0)

protobuf可以将文件内容作为流媒体IEnumerable<T>提供给您,因此您可以轻松地执行此操作。不幸的是,我不知道如何调用该方法,但在文档中很容易找到。

相关问题