gpt4 book ai didi

C# DataTable 过滤器最快的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:17:42 24 4
gpt4 key购买 nike

我有一个包含超过 300.000 条记录的数据表,这相当于超过 2.000.000 个单词。我有一个算法可以从每条记录中获取所有单词并且运行良好,但我觉得它看起来有点慢。

我想加快这个程序。

程序就是这样运行的;

  1. 将所有记录从数据库获取到数据表。
  2. 循环数据表并从每条记录中获取所有单词。
  3. 对于每个单词,检查新数据表是否包含该单词,如果不添加到新数据表。

我搜索了一些关于加速这个程序的标题。

  1. 使用 foreach 还是 for ? (我觉得,没有区别)
  2. 检查数据表是否有单词,使用 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 中来提高性能。但是如果你使用 SqlDataReader和一个 HashSet<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);
}
}

关于C# DataTable 过滤器最快的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39095329/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com