在這個Ruby 1.8.7應用程序中,需要YAML反序列化(使用YAML.load
完成),因爲現有數據存儲在許多相對較小的YAML文檔中,但是是性能瓶頸。如何在Ruby 1.8.7中獲得更快的YAML加載?
有沒有更好的方法或圖書館?升級到紅寶石1.9不是一種選擇。
在這個Ruby 1.8.7應用程序中,需要YAML反序列化(使用YAML.load
完成),因爲現有數據存儲在許多相對較小的YAML文檔中,但是是性能瓶頸。如何在Ruby 1.8.7中獲得更快的YAML加載?
有沒有更好的方法或圖書館?升級到紅寶石1.9不是一種選擇。
我沒有找到辦法做到這一點。我已經嘗試通過字符串處理將YAML轉換爲JSON,然後使用快速JSON解析器(如Yajl和OJ)解析該YAML,但將YAML轉換爲JSON的開銷已經比實際解析YAML的時間更長。
我的轉換腳本的速度可能不如它的速度快,因爲如果有人聰明真的專注了很多時間來做到這一點,但是在我意識到即使我優化了我自己的腳本之後,不會超過YAML解析時間,足以保證整個方法。
我不是專家,但如果可以將YAML文檔轉換爲Marshal文檔,然後在應用程序中使用Marshal.load
,則應該快得多。我回過頭來用this gist來比較YAML和Marshal的表現。
還有一些顯示「Marshal」的基準測試顯着更快:http://blog.carlmercier.com/2010/11/19/yaml-zaml-marshal-json-benchmark-in-ruby/和http:// significantbits .wordpress.com/2008/01/29/yaml-vs-marshal-performance/ – Casper 2012-07-06 12:27:52
我應該強調一下,但我無法改變現有的文檔。如果是的話,我會選擇更快的序列化格式,比如Marshal或者JSON。 – mislav 2012-07-06 12:52:00
根據this experiment,在1.8.7下使用ZAML將比YAML解析器更快。
ZAML只提供'dump'方法,而我只對'load'方法感興趣。 – mislav 2012-07-18 09:43:16
您是否使用yaml中的許多特殊功能(自定義類型,錨點,別名)?如果不是,也許你可以將你的yaml文件映射到JSON,然後解析json。儘管 – 2012-07-06 13:03:04
聽起來很好,但沒什麼特別之處。這是一個有趣的想法。 – mislav 2012-07-06 15:03:08
你已經檢查過CPU,而不是I/O,是瓶頸,對吧? – 2012-07-12 03:18:28