最近、WPF アプリケーションを開始しました。それを BaseX (XML ベース) データベースに接続し、そこから約 100 万のエントリを取得しました。エントリを反復処理し、エントリごとに何かを計算してから、データベースに書き戻したいと思いました。
IEnumerable<Result> resultSet = baseXClient.Query("...", "database");
foreach (Result result in resultSet)
{
...
}
問題: foreach の内部には到達しません。Query() メソッドは非常に高速に戻りますが、foreach に到達すると、C# はコレクションで何かを実行しているように見えますが、コードは非常に長い間継続していません (少なくとも 10 分、それ以上実行させないでください)。何が起きてる?取得するアイテムの数を制限しようとしました。100.000 件の結果を取得すると、同じことが発生しますが、コードは約 10 ~ 20 秒後に続行されます。100 万件の結果を完全に取得すると、C# は永遠にスタックしているように見えます...
何か案は?よろしく
編集:なぜこれが起こっ
ているのか ご指摘のとおり、この動作の理由は、実際にMoveNext()
は Enumerable 内の Enumerator が呼び出されたときにのみクエリが評価されるためと思われます。私のデータベースは一度に 1 つの値を返すことができないようですが、代わりに 100 万のデータセット全体を一度に返します。別のデータベース (全文検索をサポートしているため、可能であれば Apache Lucene) に切り替えて、この投稿を編集して何か変更があったかどうかをお知らせします。
PS: はい、100 万件の結果が多いことは承知しています。これはライブでの使用を意図したものではなく、データを準備するためのステップにすぎません。コードが数秒で実行されるとは思っていませんでしたが、それでもデータベースのパフォーマンスが非常に低いことに驚きました。
編集: 解決策そこで、XML データベースを Apache Lucine に移行しました。魔法のように動作します!もちろん、Lucine はテキストベースのデータベースであり、すべてのユースケースに適しているわけではありませんが、私にとっては驚異的に機能しました。数秒で 100 万を超えるエントリを反復処理できます。ループごとに 1 つのエントリがフェッチされます。非常にうまく機能します。