我使用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。较小的文件都可以工作,较大的文件不工作。有什么想法可能会出错吗?我意识到我没有给出很多细节,可以按要求提供更多。
答案 0 :(得分:1)
在这里,我需要参考最近关于protobuf list的讨论:
Protobuf使用int来表示大小,因此它可能支持的最大大小是<2G。我们没有任何计划在代码中将int更改为size_t。用户应避免使用过大的邮件。
我猜测 protobuf-net内部失败的原因基本相同。我可以更改protobuf-net以支持更大的文件,但我必须建议这是不推荐,因为看起来没有其他实现可以很好地处理这么大的数据。
修复可能只是在读取器/编写器层中将大量int
更改为long
的情况。但是:您的数据布局是什么?如果有一个外部对象基本上是实际对象的列表,那么使用增量阅读器可能会有一种偷偷摸摸的方式(基本上,直接欺骗repeated
支持)。