3

我有一个包含 400k+ XML 文档的文件夹,还有更多,每个文件都以“ID”.xml 命名,每个文件都属于一个特定的用户。在 SQL 服务器数据库中,我将 XML 文件中的“ID”与用户 ID 匹配,这是我将 XML 文档与用户互连的地方。用户可以附加无限数量的 XML 文档(但假设最多 >10k 文档)

所有 XML 文档都有一些共同的元素,但结构可能会有所不同。

现在,每个用户都需要在属于她的 XML 文档中进行搜索,而到目前为止我所尝试的(遍历每个文件并使用流式阅读器读取它)太慢了。我不在乎,如果它读取并匹配整个文件的属性等等,或者只是每个元素中的文本。首先应该返回的是一个包含文件名中 ID 的列表。

如果有的话,这里最快和最聪明的方法是什么?

4

7 回答 7

2

我认为LINQ-to-XML可能是您想要的方向。

假设您知道所需标签的名称,您将能够搜索这些特定元素并返回值。

var xDoc = XDocument.Load("yourFile.xml");

var result = from dec in xDoc.Descendants()
             where dec.Name == "tagName"
             select dec.Value;

results然后将包含IEnumerable名称与“tagName”匹配的任何 XML 标记的值

查询也可以这样写:

var result = from dec in xDoc.Decendants("tagName")
             select dec.Value;

或这个:

var result = xDoc.Descendants("tagName").Select(tag => tag.Value);

输出是相同的,只是根据元素名称进行过滤的不同方式。

于 2012-05-09T12:17:43.013 回答
2

您必须打开每个包含相关数据的文件,如果您不知道哪些文件包含它,则必须打开所有可能匹配的文件。因此,唯一的性能提升将在解析例程中。

在解析 Xml 时,如果需要速度,您可以使用 ,XmlReader因为它比其他解析器执行得更好(大多数在查询之前读取整个 Xml 文件)。它是只转发的事实不应该成为这种情况的限制。

如果解析时间与磁盘 I/O 一样长,您可以尝试并行解析文件,这样一个线程可以等待读取文件,而另一个线程解析加载的数据。不过,我不认为你可以在那里取得那么大的胜利。

还有什么是“太慢”,什么是可以接受的?许多文件的这种解决方案会随着时间的推移而变慢吗?

于 2012-05-09T12:18:10.050 回答
1

Use LINQ to XML.

Check out this article. over at msdn.

XDocument doc = XDocument.Load("C:\file.xml");

And don't forget that reading so many files will always be slow, you may try writing a multi-threaded program...

于 2012-05-09T12:10:51.497 回答
1

如果我理解正确,您不想为特定用户打开每个 xml 文件,因为无论您使用 linq to xml 还是其他方法都太慢了。您是否考虑过在 xml 文件和关系数据库(标签)(连同 xml ID)中保存一些值。在这种情况下,您可以先在 DB 中搜索一些值,然后只选择包含搜索值的 xml 文件?

例如:ID、tagName1、tagName2 xmlDocID、value1、value2

我的另一个问题是,您为什么选择将 xml 文档存储在文件系统中。如果您使用的是 SQL Server 2005/2008,它对存储、搜索 xml 列(甚至在 xml 中索引某些值)有很好的支持

于 2012-05-09T12:31:08.500 回答
0

您是否只是在某处寻找内容中包含特定字符串的文件?

警告 - 不是纯 .NET 解决方案。如果这让您感到害怕,请坚持使用其他答案。:)

如果这就是您正在做的事情,另一种选择是让grep之类的东西为您完成繁重的工作。使用“-l”参数来说明您只对文件名感兴趣并且您是赢家。(更多使用示例,请参见此链接

于 2012-05-09T12:26:34.867 回答
0

LB已经提出了一个有效的观点。在这种情况下,Lucene.Net(或任何索引器)是必须的。它会在所有搜索中为您提供稳定(非常快速)的性能。处理大量任意数据是索引器的主要优点之一。

或者有什么理由,你为什么不使用 Lucene?

于 2012-05-09T12:47:28.993 回答
0

Lucene.NET(和 Lucene)支持增量索引。如果您可以每隔一段时间重新打开索引进行阅读,那么您可以整天将文档添加到索引中——您的搜索将与您上次重新打开索引进行搜索时保​​持同步。

于 2012-05-11T12:20:16.190 回答