Ruby 1.9.2 上的电子表格 Gem 速度慢得难以忍受

Posted

技术标签:

【中文标题】Ruby 1.9.2 上的电子表格 Gem 速度慢得难以忍受【英文标题】:Spreadsheet Gem unbearably slow on Ruby 1.9.2 【发布时间】:2011-01-28 22:10:48 【问题描述】:

我正在为我的数据团队构建一个 Excel 解析器,但在使用电子表格 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'

我想避免猴子修补这个,或者直接潜入 gem 来破解解决方案。有没有其他人遇到过这个问题?或者类似的?

【问题讨论】:

【参考方案1】:

调整你的 GC 看看是否能解决任何问题:

对于稀土元素:

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,YMMV。

通过这些调整,使用电子表格 gem 导出 25k 行 excel 对我们来说从 10 多分钟缩短到了 2 分钟左右。

【讨论】:

【参考方案2】:

两个想法:

Rails 3 仍然是 officially supports 1.8.7:

我们推荐 Ruby 1.8.7 或 Ruby 1.9.2

Profile it 查看问题出在哪里。那么你可能会更好地了解该做什么。

【讨论】:

感谢您的分析链接,我将立即使用那里的线索进行调查。【参考方案3】:

一旦你不使用 IRB 就可以正常工作

在 IRB 中测试时使用:

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

=> 无

【讨论】:

以上是关于Ruby 1.9.2 上的电子表格 Gem 速度慢得难以忍受的主要内容,如果未能解决你的问题,请参考以下文章

如何使用ruby中的电子表格gem从excel单元格中提取超链接地址?

如何使用 Ruby 的邮件 gem 通过 smtp 发送电子邮件?

ruby更换gem阿里镜像

Ruby:mysql2-Gem 不工作(Mac OS X Snow Leopard,Ruby 1.9.2)

通过 RVM 在 Ubuntu、Ruby 1.9.2 上安装使用本机扩展的 gem 时出错

即使安装了 gem,Ruby 也找不到所需的库