Электронная таблица Gem невыносимо медленная на Ruby 1.9.2

Я создаю синтаксический анализатор Excel для своей группы данных и столкнулся с проблемой, связанной с драгоценным камнем Spreadsheet 0.6.5.1.

В Ruby 1.9.2 использование метода Spreadsheet.open немедленно перескакивает на 700-1,3 г памяти и зависает там на неопределенное время даже на небольших (1 лист, 300 строк) книгах. Между тем, в Ruby 1.8.7 Spreadsheet.open работает быстро и безупречно.

Прямо сейчас я много работаю в irb, так что я могу контролировать среду, которую я использую, только для основ (rubygems/гем электронных таблиц), но мне нужно в конечном итоге переместить этот парсер в проект Rails 3, так что останавливаться на 1.8.7 не вариант.

Нет документации по этой проблеме или даже свидетельств того, что другие люди сталкивались с этой проблемой. Всякий раз, когда я прерываю вызов Spreadsheet.open, я каждый раз получаю эту ошибку:

gems/spreadsheet-0.6.5.1/lib/spreadsheet/worksheet.rb:181:in 'вызов'

Я бы не хотел, чтобы обезьяна исправляла это или погружалась прямо в драгоценный камень, чтобы взломать разрешение. Кто-нибудь еще сталкивался с этой проблемой? Или что-то подобное?


person ironchamber    schedule 28.01.2011    source источник


Ответы (3)


Настройте 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.

Благодаря этим настройкам экспорт 25 000 строк в Excel с использованием гем-таблицы для нас сократился с 10+ минут до ~2 минут.

person Mihai Târnovan    schedule 09.07.2012

Две мысли:

  • #P2# <блочная цитата> #P3#
  • Профилируйте его, чтобы увидеть, в чем проблема. Тогда вы, возможно, лучше поймете, что делать.

person Telemachus    schedule 28.01.2011
comment
Спасибо за ссылку на профилирование, я сразу же рассмотрю возможность использования потенциальных клиентов. - person ironchamber; 29.01.2011

Он будет работать нормально, если вы не используете IRB.

При тестировании в IRB используйте это:

2.1.0 :003 > book = Spreadsheet.open 'myfile.xls'; ноль

=> ноль

person nthg2say    schedule 23.01.2015