我有一个数据表,其中包括超过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);
}
}
}
4条答案
按热度按时间knpiaxh11#
可能最有效的方法是在数据库中进行筛选,而不是首先将所有数据加载到内存中。但是,您也可以通过不将所有加载到
DataTable
中来提高性能,而是使用SqlDataReader
和HashSet<string>
:gmxoilav2#
Here你可以看到最快的方法是Parallel和Linq:
70gysomp3#
由于新添加的单词没有排序,因此您的软件将以指数级速度缓慢,因此它将为记录中的每个单词遍历所有单词。
要做的一件基本的事情是使你的数据表到一个列表,并插入到列表的话。在开始时,它将是空的,所以你可以只添加第一个单词。然后你可以Binary Search遍历给定单词的列表,如果没有找到,就把新单词插入到排序的列表中,如果找到了,就跳过它。
这是一个更适合您的软件的解决方案。
uyto3xhc4#
将每个单词作为关键字放入字典中,并分配创建的表引用以进行快速搜索以做出决定。将您需要的关键字设计为虚拟索引。