电子表格宝石在Ruby 1.9.2上运行极慢

3
我正在为我的数据团队构建一个Excel解析器,但在使用Spreadsheet 0.6.5.1 gem时遇到了问题。
在Ruby 1.9.2中,使用Spreadsheet.open方法会立即占用700m-1.3g的内存,并且即使是小型工作簿(1个表格,300行),也会无限期地挂起。而在Ruby 1.8.7中,Spreadsheet.open则非常快捷和完美。
目前我在irb中进行大量工作,以便我可以将使用环境控制在基本要素(rubygems/spreadsheet gem)中,但我最终需要将这个解析器移植到Rails 3项目中,所以不能只使用1.8.7。
对于这个问题,没有文档或其他人经历过类似的问题。每当我中止Spreadsheet.open调用时,都会出现以下错误信息:
gems/spreadsheet-0.6.5.1/lib/spreadsheet/worksheet.rb:181:in 'call'
我希望避免对其进行monkey patching,或直接进入gem中进行修改。有其他人经历过这个问题吗?或类似的问题?
3个回答

2

调整您的GC,看看是否可以解决问题:

对于REE:

export RUBY_HEAP_MIN_SLOTS=1000000
export RUBY_HEAP_SLOTS_INCREMENT=1000000
export RUBY_HEAP_SLOTS_GROWTH_FACTOR=1
export RUBY_GC_MALLOC_LIMIT=1000000000
export RUBY_HEAP_FREE_MIN=500000

类似的方法在1.9.x版本上也应该可行,但效果因人而异。

通过这些调整,使用电子表格宝石(spreadsheet gem)进行的一次包含2.5万行数据的Excel导出,我们的处理时间从10分钟以上缩短至约2分钟。


0

两个想法:


谢谢提供性能分析链接,我会立即调查使用那里的线索。 - ironchamber

0

只要不使用IRB,它就能正常工作

在IRB中进行测试时,请使用以下命令:

2.1.0 :003 > book = Spreadsheet.open 'myfile.xls'; nil

=> nil


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接