【问题标题】:Big files deserializations by protobuf-netprotobuf-net 对大文件进行反序列化
【发布时间】:2013-01-08 14:04:42
【问题描述】:

我需要反序列化 1.5GB 的 txt 文件。我正在使用来自 code.google.com/p/protobuf-net/

的 protobuf-net

有时它会在不同的地方出现不同的异常(空引用、内存访问冲突)而失败(大约 50% 的情况)。我注意到,如果处理器负载低,那么故障的可能性就会降低。

我应该怎么做才能避免这样的失败?

下面是反序列化代码的例子:

public static History LoadFromFile(string path)
    {
        using (var fileStream = File.OpenRead(path))
        {
            var obj = Serializer.Deserialize<History>(fileStream);                
            return obj;
        }
    }

今天我有一个错误代码为 0xc0000005 的 FatalExecutionEngineError,但我无法意识到代码的哪一部分可能不安全。这不是一个持续的错误,我重新启动应用程序后一切正常。

这里是带有序列化的文件示例,我需要对其进行反序列化: https://docs.google.com/file/d/0B1XaGInC6jg3ZXBZZDA3bHh3bVk/edit

【问题讨论】:

  • 困惑... Protobuf != 文本。你能澄清你在做什么吗?也许一些代码?
  • 我理解其中的区别。起初,出于性能原因,我在 .txt 文件中序列化了大量数据。顺便说一句,当结果文件的大小超过 2GB 时,它会失败。我认为它的原因是protobuf-net.dll中的int变量之后我尝试将数据序列化为几个文件,然后在反序列化后得到一个完整的对象。但之后出现了我上面提到的一些不同的错误。
  • 我将不得不调查 2GB 的问题,但是:被序列化的数据可能会影响它可以得到多少(有些事情可能需要缓冲)。顺便说一句,核心 google protobuf 文档建议不要使用大文件。但是:在复制它方面,你仍然没有给我太多的帮助。我可以尝试一些随机的东西,但我不能保证我会得到一个复制品。
  • @MarcGravell,我在头部消息中添加了一些代码和文件示例。请告诉我,如果您需要任何其他信息。避免这种反复无常的错误对我来说至关重要。
  • 用文件 "d" 我可以看到 383232 个外部节点;文件“e”似乎已损坏 - 在 133792 个外部节点(和 538642144 个字节)之后,我得到一个字段 0(这是非法的)。但是,由于 protobuf 是一种模棱两可的有线格式(没有架构,您无法可靠地理解数据),您能否分享一些架构信息?或者理想情况下:History 类?在stackoverflow上,或者如果它是敏感的,可以通过电子邮件发送

标签: deserialization protobuf-net binary-deserialization


【解决方案1】:

谷歌:

协议缓冲区不是为处理大消息而设计的。作为一般经验法则,如果您要处理的消息均大于 1 兆字节,则可能是时候考虑另一种策略了。也就是说,Protocol Buffers 非常适合处理大型数据集中的单个消息。

Source link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-26
    • 2013-02-03
    • 1970-01-01
    • 2012-01-06
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多