0

我需要將很多對象序列化爲一個文件(多個GB)。我們選擇在這個項目中使用Google的協議緩衝區來處理其他事情,所以我想我會使用它來序列化從線路接收的對象。這似乎工作:如何在ruby中反序列化多個對象1.8.7 lazily

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

deserializtion是什麼給我的問題。我看到其他人做這樣一個對象:

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-protocol-buffers

回答

1

編碼protobufs不是自我界定,因此,如果你寫多一個流,然後嘗試解析它們,整個流會被解析爲一個單一的消息,與後者的字段值覆蓋較早的。您需要在每個消息的前面加上大小,然後確保在接收端只讀取很多字節。

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

不幸的是我不知道的Ruby,所以我不能給你的代碼示例。它看起來像您鏈接的Ruby protobuf庫中的類LimitedIO可能對解析消息很有用,而不會超過特定的長度。

+0

謝謝。在得到更多的澄清之後,我發現我們正在爲一定數量的對象使用另一個協議緩衝區。這讓我更加接近。 – user197674