Libxml Ruby: нужно ли вручную собирать наборы узлов, возвращаемых doucment#find?

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

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

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

# nodes = nil # GC.start

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

1 ответ

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

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

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

узлов = ноль

GC.start


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

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

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

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

Крис

Другие вопросы по тегам