3

我正在为我的数据团队构建一个 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 来破解一个分辨率。有没有其他人遇到过这个问题?或者类似的东西?

4

3 回答 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,YMMV。

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

于 2012-07-09T13:22:08.730 回答
0

两个想法:

  • Rails 3 仍然官方支持 1.8.7

    我们推荐 Ruby 1.8.7 或 Ruby 1.9.2

  • 分析它以查看问题所在。然后,您可能会更好地了解该做什么。

于 2011-01-28T22:17:06.513 回答
0

一旦您不使用 IRB,它将正常工作

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

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

=> 无

于 2015-01-23T23:48:13.307 回答