linq C#数据表过滤器最快的方法

mo49yndu  于 2023-09-28  发布在  C#
关注(0)|答案(4)|浏览(131)

我有一个数据表,其中包括超过300.000条记录,这等于超过2.000.000字。我有一个算法,得到所有的话,从每个记录和工作良好,但我觉得它看起来有点慢。
我想加快这个程序。
程序就是这样工作的;
1.将所有记录从数据库获取到数据表。
1.循环datatable并从每个记录中获取所有单词。
1.对于每个单词,检查新数据表是否包含该单词,如果不包含,则添加到新数据表。
我搜索了一些关于加速这个程序的标题。
1.用foreach还是for?(我认为,没有什么区别)
1.检查数据表是否有字,使用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);
                }
            }
        }
knpiaxh1

knpiaxh11#

可能最有效的方法是在数据库中进行筛选,而不是首先将所有数据加载到内存中。但是,您也可以通过不将所有加载到DataTable中来提高性能,而是使用SqlDataReaderHashSet<string>

private static readonly char[] WordSeparator = { ' ', '\t', ',', '.', ':' }; // to be continued
// ....

HashSet<string> allUniqueWords = new HashSet<string>();
using (var con = new SqlConnection(Properties.Settings.Default.ConnectionString))
using (var cmd = new SqlCommand("SELECT DISTINCT ColumnName FROM dbo.TableName", con))
{
    con.Open();
    using (var rd = cmd.ExecuteReader())
    {
        string[] words = rd.GetString(0).Split(WordSeparator, StringSplitOptions.RemoveEmptyEntries);
        foreach (string word in words)
            allUniqueWords.Add(word);
    }
}
gmxoilav

gmxoilav2#

Here你可以看到最快的方法是Parallel和Linq:

var sampleResults = from DataRow sampleRow in dataTableLocal.AsEnumerable()
                            where sampleRow.Field<string>("FirstColumn") == symbolName
                            select sampleRow;

        Parallel.ForEach(sampleResults, sampleRow =>
        {
            string sval = sampleRow["SecondColumn"].ToString();
        });
70gysomp

70gysomp3#

由于新添加的单词没有排序,因此您的软件将以指数级速度缓慢,因此它将为记录中的每个单词遍历所有单词。
要做的一件基本的事情是使你的数据表到一个列表,并插入到列表的话。在开始时,它将是空的,所以你可以只添加第一个单词。然后你可以Binary Search遍历给定单词的列表,如果没有找到,就把新单词插入到排序的列表中,如果找到了,就跳过它。
这是一个更适合您的软件的解决方案。

uyto3xhc

uyto3xhc4#

将每个单词作为关键字放入字典中,并分配创建的表引用以进行快速搜索以做出决定。将您需要的关键字设计为虚拟索引。

相关问题