Libxml Ruby: нужно ли вручную собирать наборы узлов, возвращаемых doucment # find? - PullRequest
0 голосов
/ 19 февраля 2010

В документации по LibXML :: XML :: Document # указано, что для предотвращения ошибок сегмента необходимо использовать следующий стиль кода:

nodes = doc.find('/header')
nodes.each do |node|
  ... do stuff ...
end

Это все, что мне нужно сделать?Ниже поля с примером кода есть закомментированный код:

# nodes = nil # GC.start

Нужно ли включать этот код, чтобы избежать ошибки при сегментировании?Я бы не подумал, что стиль, показанный в первом блоке кода, сильно поможет с проблемами со ссылками.Я попробовал это без закомментированного кода и у меня не было проблем после обработки большого количества файлов, но, возможно, это то, что возникает в редких случаях.

1 Ответ

0 голосов
/ 19 февраля 2010

Нет. Закомментированный код выглядит так, как будто автор беспокоился о проблеме с взаимодействием с GC, и в последующих замечаниях

Когда процесс завершается, Ruby иногда освобождает объект документа перед объектом узлов, тем самым вызывая ошибку сегментации.

Прежде чем кто-либо спросит, у класса узлов есть функция mark, которая сообщает Ruby что это зависит от документа. Функция отметки работает нормально, и если следующие две строки кода добавляются в конец тестового кода все хорошо:

узлов = ноль

GC.start


Я бы об этом не слишком волновался, потому что:

(а) Проблема относится к библиотеке в 2008 году

(b) Многие из нас использовали LibXML, и кроме того, что это неудобно, он быстрый и стабильный, поэтому автор, должно быть, разобрался со своими проблемами.

Если вы ищете альтернативы, посмотрите здесь

Chris

...