所以我正在尝试使用 Nokogiri 解析一个 400k+ 行的 XML 文件。
XML 文件具有以下基本格式:
<?xml version="1.0" encoding="windows-1252"?>
<JDBOR date="2013-09-01 04:12:31" version="1.0.20 [2012-12-14]" copyright="Orphanet (c) 2013">
<DisorderList count="6760">
*** Repeated Many Times ***
<Disorder id="17601">
<OrphaNumber>166024</OrphaNumber>
<Name lang="en">Multiple epiphyseal dysplasia, Al-Gazali type</Name>
<DisorderSignList count="18">
<DisorderSign>
<ClinicalSign id="2040">
<Name lang="en">Macrocephaly/macrocrania/megalocephaly/megacephaly</Name>
</ClinicalSign>
<SignFreq id="640">
<Name lang="en">Very frequent</Name>
</SignFreq>
</DisorderSign>
</Disorder>
*** Repeated Many Times ***
</DisorderList>
</JDBOR>
这是我创建的用于解析每个 DisorderSign id 和 name 并将其返回到数据库中的代码:
require 'nokogiri'
sympFile = File.open("Temp.xml")
@doc = Nokogiri::XML(sympFile)
sympFile.close()
symptomsList = []
@doc.xpath("////DisorderSign").each do |x|
signId = x.at('ClinicalSign').attribute('id').text()
name = x.at('ClinicalSign').element_children().text()
symptomsList.push([signId, name])
end
symptomsList.each do |x|
Symptom.where(:name => x[1], :signid => Integer(x[0])).first_or_create
end
这对我使用的测试文件非常有效,尽管它们要小得多,大约 10000 行。
当我尝试在大型 XML 文件上运行它时,它根本没有完成。我把它放在一夜之间,它似乎只是锁定了。我编写的代码是否有任何根本原因会使内存非常密集或效率低下?我意识到我将每个可能的对存储在一个列表中,但这不应该大到足以填满内存。
感谢您的任何帮助。