私は300.000以上のレコードを含むデータテーブルを持っています。これは2.000.000以上の単語に相当します。私は各レコードからすべての単語を取得し、うまく動作するアルゴリズムを持っていますが、少し遅いような感じです。C#DataTableフィルター最速の方法
私はこのプログラムをスピードアップしたいと思います。
プログラムはそのように動作します。
- データベースからすべてのレコードをdatatableに取得します。
- ループ可能で、各レコードからすべての単語を取得します。
- 各ワードチェックでは、新しいデータテーブルには、そのワードが含まれています(新しいデータテーブルに追加されない場合)。
私はこのプログラムのスピードアップに関するいくつかのタイトルを検索します。
- foreachまたはforを使用していますか?各単語が含まかを確認します(私は、差がないと思います)
- データテーブルをチェックするためには、単語やない、DataTable.Selectを使用して()またはLINQの(実際にLINQの方が高速です)
を持っているしかし、私はそれを心配します単語フィールドをプライマリ(私はそれが動作するかどうかはわかりません)またはすべての単語を確認せずに取得し、すべての作品の後にdistincを使用します。
私にいくつかのアドバイスをお願いできますか?ありがとう。
DataTable dtProducts = getProducts();
bool contains;
string[] keys;
dt.Columns.Add("keyword", typeof(string));
for (int i = 0; i < dtProducts.Rows.Count; i++) //114040
{
keys = GetWords(dtProducts.Rows[i]["name"].ToString().Trim());
foreach (string key in keys)
{
DataRow dr = dt.NewRow();
dr["keyword"] = key;
contains = dt.AsEnumerable().Any(row => key == row.Field<string>("keyword"));
if (!contains)
{
dt.Rows.Add(dr);
}
}
}
いくつかのコードを表示することができますが、それはあなたにいくつかのヒントを与えるのが簡単になります。 –
「DataTable」を使用している理由は何ですか? 'HashSet'を使って、DataTableが途切れることなくデータベースから読んでいる間に追加する必要があるようです。 –
おそらく最も効率的な方法は、データベースをフィルタリングして、すべてをメモリに最初にロードしないことです。 –