反序列化大文件时的Protobuf异常

时间:2014-05-09 11:05:47

标签: c# protobuf-net

我使用protobuf将大对象序列化为二进制文件以进行反序列化,并在以后再次使用。但是,当我反序列化一些较大的文件时,我遇到了问题。文件大小约为2.3 GB,当我尝试反序列化它时,我会抛出几个异常(按以下顺序):

我已经看过第二个例外中引用的问题,但这似乎并没有涵盖我遇到的问题。

我使用Microsoft的HPC包生成这些文件(需要一段时间),因此序列化如下所示:

   using (var consoleStream = Console.OpenStandardOutput())
   {
            Serializer.Serialize(consoleStream, dto);
   }

我正在按如下方式阅读文件:

    private static T Deserialize<T>(string file)
    {
        using (var fs = File.OpenRead(file))
        {
            return Serializer.Deserialize<T>(fs);
        }
    }

文件是两种不同的类型。一个大约1GB,另一个大约2.3GB。较小的文件都可以工作,较大的文件不工作。有什么想法可能会出错吗?我意识到我没有给出很多细节,可以按要求提供更多。

1 个答案:

答案 0 :(得分:1)

在这里,我需要参考最近关于protobuf list的讨论:

  

Protobuf使用int来表示大小,因此它可能支持的最大大小是<2G。我们没有任何计划在代码中将int更改为size_t。用户应避免使用过大的邮件。

猜测 protobuf-net内部失败的原因基本相同。我可以更改protobuf-net以支持更大的文件,但我必须建议这是推荐,因为看起来没有其他实现可以很好地处理这么大的数据。

修复可能只是在读取器/编写器层中将大量int更改为long的情况。但是:您的数据布局是什么?如果有一个外部对象基本上是实际对象的列表,那么使用增量阅读器可能会有一种偷偷摸摸的方式(基本上,直接欺骗repeated支持)。