0

我需要将大量对象序列化为一个文件(多个 GB)。我们选择在这个项目中使用谷歌的协议缓冲区来处理其他事情,所以我想我会用它来序列化我从网络接收到的对象。这似乎有效:

File.open(file_name, 'ab') do |f|
  some_objects.each { |some_object|
    some_object.serialize(f)
  }
end

反序列化是给我带来问题的原因。我见过其他人这样做一个对象是这样的:

File.open(file_name, 'r') do |f|
  no = some_object.parse(f)
end

但这只是一个。我试过这样做:

File.open(file_name, 'r').each do |f|
  no = some_object.parse(f)
end

但这引发了这个异常:

Uncaught exception: undefined method `<<' for false:FalseClass

我需要得到所有这些并懒惰地评估它们。有什么想法吗?请随时就此代码的性能提供任何建议,因为我将做 GB 的信息。谢谢你的时间。

顺便说一句,我知道我需要升级我的 ruby​​ 版本,但由于这是内部问题,我一直无法从老板那里得到时间来升级它。

我正在使用ruby​​-protocol-buffers

4

1 回答 1

1

编码的 protobuf 不是自定界的,因此如果您将多个写入流然后尝试解析它们,则整个流将被解析为单个消息,后面的字段值会覆盖前面的字段值。您需要在每条消息前面加上它的大小,然后确保只在接收端读取那么多字节。

https://developers.google.com/protocol-buffers/docs/techniques#streaming

不幸的是,我不知道 Ruby,所以我不能给你代码示例。看起来LimitedIO您链接的 Ruby protobuf 库中的类可能对解析消息很有用,而不会超过一定的长度。

于 2014-02-14T03:28:21.570 回答