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, и кроме того, что это неудобно, он быстрый и стабильный, поэтому автор, должно быть, разобрался со своими проблемами.
Если вы ищете альтернативы, посмотрите здесь
Крис