【发布时间】: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