我最近启动了一个 WPF 应用程序。我将它连接到 BaseX(基于 XML)数据库并从中检索到大约一百万个条目。我想遍历条目,为每个条目计算一些东西,然后将其写回数据库:
IEnumerable<Result> resultSet = baseXClient.Query("...", "database");
foreach (Result result in resultSet)
{
...
}
问题:永远无法到达 foreach 的内部。Query() 方法返回的速度非常快,但是当达到 foreach 时,C# 似乎对集合做了一些事情,代码不会持续很长时间(至少 10 分钟,永远不要让它再运行)。这里发生了什么?我试图限制检索到的项目数量。当检索 100.000 个结果时,会发生同样的事情,但代码会在大约 10-20 秒后继续。当检索完整的一百万个结果时,C# 似乎永远卡住了......
有任何想法吗?问候
编辑:为什么会发生这种情况
正如你们中的一些人指出的那样,这种行为的原因似乎是查询实际上只在MoveNext()
调用 Enumerable 内的 Enumerator 时才被评估。我的数据库似乎无法一次返回一个值,而是一次返回整个一百万个数据集。我将尝试切换到另一个数据库(Apache Lucene,如果可能的话,因为它有很好的全文搜索支持)并编辑这篇文章,让你知道它是否改变了任何东西。
PS:是的,我知道一百万个结果很多。这并不意味着实时使用,它只是准备数据的一个步骤。虽然我没想到代码会在几秒钟内运行,但看到数据库中的性能如此糟糕,我仍然感到惊讶。
编辑:解决方案所以我将 XML 数据库迁移到 Apache Lucine。奇迹般有效!当然,Lucine 是一个基于文本的数据库,它并不适合所有用例,但对我来说它创造了奇迹。可以在几秒钟内迭代超过一百万个条目,每个循环获取一个条目 - 效果非常好!