7

リストがあります: 約 100K+ のユーザー レコードを持つコレクション ユーザー (すべてのユーザー オブジェクトはデータベースから完全にロードされ、バイオ、名、姓などのフィールドがあります)。このコレクションは、アプリケーションの起動時にデータベースから取得され、メモリに保持されます。

次に、次のようなコードがあります。

User cachedUser = users.FirstOrDefault(x => string.Equals(x.UserName, username,
StringComparison.CurrentCultureIgnoreCase));

このコレクションからユーザーを取得するために使用します。しかし、どういうわけか、この操作は信じられないほど遅いことに気付きました。Linq を使用して大きなオブジェクトのメモリ コレクション内でクエリを実行しているときに、パフォーマンスの問題はありますか? ユーザーを取得するたびに、代わりに DB を呼び出す必要がありますか?

4

4 に答える 4

8

提供していただいた情報に基づいて、アーキテクチャを再考する必要があると思います。データベースを活用して、検索作業を任せてください。その後、観察し、測定し、それに応じて変更を加えます。全体を時期尚早に最適化したことに気付くかもしれません。

于 2012-06-20T17:03:37.703 に答える
3

LINQ クエリは、他の反復手法 (ループ、配列内の検索) と同様に、要求されたレコードが見つかるまですべてのレコードにアクセスします。最悪の場合、それは 100k の比較を意味します。これを高速化するには、次のオプションがあります。

  1. ソートされたリストまたは辞書を使用してください。バイナリ検索の方がはるかに高速です。ORDER BY を使用してデータベースから取得するときにデータを並べ替える
  2. DataSet を使用します。これは、より高速な検索を提供するインメモリ データベースのようなものです。
  3. データベースにデータを残し、適切なインデックスを設定してアクセスを高速化する

次の理由により、データベースを使用することをお勧めします。

  • おそらく使用することのない 100k レコードを保存するのはメモリの無駄です。
  • データを変更したらすぐにキャッシュを更新する必要がありますが、これはかなり複雑な場合があります
  • Web アプリケーションはマルチスレッドです (すべての要求は独自のスレッドで実行されます)。データを変更する場合は、ロックと同期する必要があります。
  • データベースは頻繁に呼び出されるデータをキャッシュできます
  • あなたはより少ないコードを書く必要があります
  • スケーリングに優れたステートレス Web アプリケーションがある (Web ファーム)
  • アプリケーションにはおそらく他のデータがあり、すべてをメモリに保存することはできません
于 2012-06-20T16:55:01.763 に答える
3

応答時間を最適化したい場合、 を作成しDictionary<T,U>てユーザーを検索できます。

    Dictionary<string, User> usersDictionary = new <Dictionary<string, User>(StringComparer.CurrentCultureIgnoreCase);

    // After querying the users from the DB add them to the dictionary             
    usersDictionary.Add(user.UserName, user);

    // Then when you need to retrieve a user
    User retrieveUser = null; 
    usersDictionary.TryGetValue(username, out retrieveUser);

それが役立つことを願っています!

于 2012-06-20T17:03:09.507 に答える
0

検索パフォーマンスの違いに気付くのは、データベースがインデックスを使用してデータベース内の文字列を検索するためですが、メモリ内では、レコードが見つかるまですべてのレコードを単純に検索します。また、データベースは文字列のハッシュ番号を保持し、この番号ハッシュを検索します。これははるかに高速であり、実際に文字列を比較することはありません。

インデックス作成も行いますDictionary<>が、データの追加が遅れます。データが増え始めると、データを追加するたびに正しいインデックスポイントに配置する場所が検索されるためです。

また、データベースは結果をキャッシュし、多くのデータベースはインデックス作成もキャッシュし、探しているものをすばやく見つけるのに役立つ追加の統計を作成します。

追加のカスタム ケースのために何かを高速化できる場合を除いて、データベースに検索を行わせる方がよいでしょう。

于 2012-06-20T19:03:36.103 に答える