XML:
<database totalkeys="172" totalvalues="98014">
<key id="k1" name="Key1" valuecount="3">
<value id="v1" name="Value1"/>
<value id="v2" name="Value2"/>
<value id="v3" name="Value3"/>
</key>
<key id="k2" name="Key2" valuecount="3">
<value id="v1" name="Value1"/>
<value id="v2" name="Value2"/>
<value id="v3" name="Value3"/>
</key>
</database>
实际的XML本身要大得多,你可以通过totalkeys和totalvalues属性看到。每个<key>
都有5到19000个值。
为了更新XML,我必须从三个不同的来源收集信息。从这些来源我创建了3个词典。
Dictonary<string, List<string>>
- &gt; <keyId, List<valueIds>>
Dictonary<string, string>
- &gt; <keyId, keyName>
Dictonary<string, string>
- &gt; <valueId, valueName>
如何更新XML而无需单独检查每个<key>
和<value>
是否已存在?目前我为每个使用SelectSingleNode,如果它返回null,我创建节点并将其附加到xml。这很慢。有没有更快的方法来解决这个问题?对于这么大的数据库,XML是否是正确的选择?
答案 0 :(得分:3)
是的,这会很慢。 XML文件未编入索引,因此当您发出SelectSingleNode
查询时,必须从文件的开头开始,然后检查每个键元素,然后检查该键的每个子元素。 XML的设计并不容易搜索 - 或者像数据库一样使用。
正如@Matthew Haugen在评论中建议的那样,当您阅读XML时,您可以将XML解析为字典。然后您可以快速检查是否存在密钥。这只有在你需要进行大量更新时才有意义,这样解析整个文件的成本就低于进行搜索。这也会占用大量内存。
但这里的根本问题是XML并不是一个数据库,因为你发现大型XML文件很慢。看起来您正在尝试使用XML重新实现relation database。因此,您应该考虑将数据存储在SQL数据库中。您可以使用进程数据库,如SQL Lite甚至Microsoft Access数据库,这样您就不必设置服务器。