【问题标题】:How to deserialize multiple objects in ruby 1.8.7 lazily如何在 ruby​​ 1.8.7 中懒惰地反序列化多个对象
【发布时间】:2014-02-13 19:03:52
【问题描述】:

我需要将大量对象序列化为一个文件(多个 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

【问题讨论】:

    标签: ruby deserialization protocol-buffers lazy-evaluation ruby-1.8.7


    【解决方案1】:

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

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

    很遗憾,我不懂 Ruby,所以我不能给你代码示例。看起来您链接的 Ruby protobuf 库中的 LimitedIO 类可能有助于在不超过一定长度的情况下解析消息。

    【讨论】:

    • 谢谢。在得到更多澄清后,我发现我们正在为一定数量的对象使用另一个协议缓冲区。这让我更接近了。
    猜你喜欢
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2016-10-07
    • 2017-10-24
    • 2012-06-07
    • 1970-01-01
    • 2015-09-26
    • 2013-08-21
    相关资源
    最近更新 更多