Я работал над приложением формы Windows в VB. NET, чтобы проанализировать большой документ XML, который является японско-английским sh словарем. Первоначально я создал анализатор на основе строк, который считывал все теги XML и извлекал их содержимое вручную. В среднем для полного анализа файла XML потребовалось около 30 секунд. На данный момент я никогда не слышал о десериализации.
Тогда, благодаря нескольким пользователям на этом сайте , я получил XML работает десериализатор, который загружает все данные из файла XML в объект класса. Brilliant. Но для загрузки в среднем требуется 20 секунд.
Хотя это повышение эффективности на 33%, мне интересно, есть ли еще лучший подход, о котором я не знал или не рассматривал. Или, возможно, неэффективность моих существующих определений кода / класса, которую я могу, по крайней мере, уменьшить.
Файл имеет длину 4,7 миллиона строк и отображает информацию для более чем 180 000 словарных статей, поэтому я готов принять, что не будьте более быстрым методом разбора XML. Мне интересно, может ли быть какой-нибудь альтернативный способ хранения данных, чем в текстовом формате XML, который может быть прочитан приложением формы Windows быстрее.
Вот код В настоящее время я использую для десериализации:
Sub Deserialise()
Dim settings As XmlReaderSettings = New XmlReaderSettings
settings.DtdProcessing = DtdProcessing.Parse
Dim xmlPath As String = Path.Combine(Application.StartupPath, jmdictpath)
Dim serialiser As New XmlSerializer(GetType(JMdict))
Using rdr As Xml.XmlReader = Xml.XmlReader.Create(xmlPath, settings)
dict = CType(serialiser.Deserialize(rdr), JMdict)
End Using
End Sub
А вот определения классов:
<XmlRoot>
Public Class JMdict
<XmlElement("entry")>
Public Property entrylist As List(Of Entry)
End Class
<Serializable()>
<XmlType("entry")>
Public Class Entry
<XmlElement("ent_seq")>
Public Property EntrySequence As Integer
<XmlElement("k_ele")>
Public Property Keywords As List(Of KeywordElement)
<XmlElement("r_ele")>
Public Property Readings As List(Of ReadingElement)
<XmlElement("sense")>
Public Property Senses As List(Of SenseElement)
End Class
<Serializable()>
<XmlType("k_ele")>
Public Class KeywordElement
<XmlElement("keb")>
Public Property Keyword As String
<XmlElement("ke_pri")>
Public Property KeywordPriority As List(Of String)
<XmlElement("ke_inf")>
Public Property KeywordOrthography As List(Of String)
End Class
<Serializable()>
<XmlType("r_ele")>
Public Class ReadingElement
<XmlElement("reb")>
Public Property Reading As String
<XmlElement("re_pri")>
Public Property ReadingPriority As List(Of String)
<XmlElement("re_inf")>
Public Property ReadingOrthography As List(Of String)
<XmlElement("re_restr")>
Public Property ReadingToKeywordRestriction As List(Of String)
Private _NotTrueReading As Boolean
<XmlElement("re_nokanji")>
Public Property NotTrueReading As String
Get
Return _NotTrueReading
End Get
Set
If NotTrueReading IsNot Nothing Then
_NotTrueReading = True
Else
_NotTrueReading = False
End If
End Set
End Property
End Class
<Serializable()>
<XmlType("sense")>
Public Class SenseElement
<XmlElement("pos")>
Public Property PartOfSpeech As List(Of String)
<XmlElement("gloss")>
Public Property Gloss As List(Of GlossElement)
<XmlElement("stagk")>
Public Property SenseRestrictedToKeyword As List(Of String)
<XmlElement("stagr")>
Public Property SenseRestrictedToReading As List(Of String)
<XmlElement("xref")>
Public Property CrossReference As List(Of String)
<XmlElement("ant")>
Public Property Antonym As List(Of String)
<XmlElement("field")>
Public Property Field As List(Of String)
<XmlElement("dial")>
Public Property Dialect As List(Of String)
<XmlElement("s_inf")>
Public Property SenseInformation As List(Of String)
<XmlElement("misc")>
Public Property Misc As List(Of String)
<XmlElement("lsource")>
Public Property LanguageSource As List(Of LanguageSourceElement)
End Class
<Serializable()>
<XmlType("gloss")>
Public Class GlossElement
<XmlAttribute("xml:lang")>
Public Property Language As String
<XmlAttribute("g_type")>
Public Property GlossType As String
<XmlText>
Public Property Text As String
Public Overrides Function ToString() As String
Return Text
End Function
End Class
<Serializable()>
<XmlType("lsource")>
Public Class LanguageSourceElement
<XmlAttribute("xml:lang")>
Public Property Language As String
<XmlAttribute("ls_type")>
Public Property LanguageSourceType As String
Private _IsWaseieigo As Boolean
<XmlAttribute("ls_wasei")>
Public Property IsWaseieigo As String
Get
Return _IsWaseieigo
End Get
Set
If IsWaseieigo = "y" Then
_IsWaseieigo = True
Else
_IsWaseieigo = False
End If
'_IsWaseieigo = Value
End Set
End Property
<XmlText>
Public Property Text As String
Public Overrides Function ToString() As String
Return Text
End Function
End Class
Что мы думаем? Есть ли надежда на более быстрое решение?
EDIT - Вот пример XML:
<entry>
<ent_seq>1486440</ent_seq>
<k_ele>
<keb>美術</keb>
<ke_pri>ichi1</ke_pri>
<ke_pri>news1</ke_pri>
<ke_pri>nf02</ke_pri>
</k_ele>
<r_ele>
<reb>びじゅつ</reb>
<re_pri>ichi1</re_pri>
<re_pri>news1</re_pri>
<re_pri>nf02</re_pri>
</r_ele>
<sense>
<pos>&n;</pos>
<pos>&adj-no;</pos>
<gloss>art</gloss>
<gloss>fine arts</gloss>
</sense>
<sense>
<gloss xml:lang="dut">kunst</gloss>
<gloss xml:lang="dut">schone kunsten</gloss>
</sense>
<sense>
<gloss xml:lang="fre">art</gloss>
<gloss xml:lang="fre">beaux-arts</gloss>
</sense>
<sense>
<gloss xml:lang="ger">Kunst</gloss>
<gloss xml:lang="ger">die schönen Künste</gloss>
<gloss xml:lang="ger">bildende Kunst</gloss>
</sense>
<sense>
<gloss xml:lang="ger">Produktionsdesign</gloss>
<gloss xml:lang="ger">Szenographie</gloss>
</sense>
<sense>
<gloss xml:lang="hun">művészet</gloss>
<gloss xml:lang="hun">művészeti</gloss>
<gloss xml:lang="hun">művészi</gloss>
<gloss xml:lang="hun">rajzóra</gloss>
<gloss xml:lang="hun">szépművészet</gloss>
</sense>
<sense>
<gloss xml:lang="rus">изящные искусства; искусство</gloss>
<gloss xml:lang="rus">{~{的}} художественный, артистический</gloss>
</sense>
<sense>
<gloss xml:lang="slv">umetnost</gloss>
<gloss xml:lang="slv">likovna umetnost</gloss>
</sense>
<sense>
<gloss xml:lang="spa">bellas artes</gloss>
</sense>
</entry>
И все это заключено в теги