我有这个代码,它运行正常,但在大型数据集上运行缓慢。
我想听听专家们是否可以使用Linq或其他方法获得此代码,如果有的话,该怎么做?
Dim array_of_strings As String()
' now I add strings to my array, these come from external file(s).
' This does not take long
' Throughout the execution of my program, I need to validate millions
' of other strings.
Dim search_string As String
Dim indx As Integer
' So we get million of situation like this, where I need to find out
' where in the array I can find a duplicate of this exact string
search_string = "the_string_search_for"
indx = array_of_strings.ToList().IndexOf(search_string)
我的数组中的每个字符串都是唯一的,没有重复。
这非常有效,但就像我说的那样,对于较大的数据集来说太慢了。我运行这个查询数百万次。目前,一百万次查询大约需要1分钟,但这对我来说太慢了。
答案 0 :(得分:5)
没有必要使用Linq。 如果您使用索引数据结构(如字典),则搜索将为O(log n),代价是稍微长一点的填充结构。但是你做了一次,然后做了一百万次搜索,你就会提前出来。
请参阅此站点的词典说明: https://msdn.microsoft.com/en-us/library/7y3x785f(v=vs.110).aspx
由于(我认为)您正在谈论一个自己的密钥集合,您可以使用SortedSet<T>
来节省一些内存
https://msdn.microsoft.com/en-us/library/dd412070(v=vs.110).aspx
答案 1 :(得分:0)
不,我不认为它可以从linq中受益。 相对而言,Linq查询速度很慢。 但是,您可能会尝试多线程。
答案 2 :(得分:-1)
您可以尝试使用似乎非常快的DataTable
:
void Main()
{
var dt = new DataTable();
dt.Columns.Add("foo", typeof(string));
dt.Columns.Add("bar", typeof(string));
dt.Columns[0].Unique = true;
dt.Rows.Add("baz", "baaz");
dt.Rows.Add("qux", "quux");
// add one million rows
for (var i = 0; i < 1000000; i++)
{
dt.Rows.Add((i*2).ToString(), i);
}
var sw = Stopwatch.StartNew();
// select some arbitrary value
var results = dt.Select("foo = '513916'");
// get its index
dt.Rows.IndexOf(results.First()).Dump("Row index");
sw.Stop();
sw.Dump("Elapsed");
}
(我无法将其翻译成VB)