我需要通过C#计算大量数据 我有10000名DB患者,每位患者在DB上的记录平均有30次访问 我需要检查他的组合是否通过C#中的LINQ SQL combinations进行了访问,并将其与其他患者进行比较 如果我发现另外4名患者有相同的组合我会认为是安全的
我将它用于循环代码,但需要时间,我需要提高性能
Parallel.For(0, 10000, (j,loopState) =>
{
int id1 = getid(names[j].ToString(), 101);
Parallel.For(0, 10000, (t,loopState1) =>
{
generate_firstACV5A(id1, nvisit(id1), names[j].ToString());
int id2 = getid(names[t].ToString(), 10000);
if (id1 == id2) { }
else
{
generate_firstACV5B(id2, nvisit(id2), names[t].ToString());
}
if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true)
{
if (count == 0)
{
safecount++;
if (safecount == 4) {
ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString());
it.SubItems.Add(names[j].ToString());
listView3.Items.Add(it); loopState1.Break();
}
}
}
});
当我将列表比较为真时,我遇到了一些运行错误
感谢您的帮助
答案 0 :(得分:2)
如果您的代码生成的ListViewItems
至少有几百个,那么问题之一是您在代码执行期间添加了ListViewItems
,这会触发ListView
重绘(与你拥有的所有其他计算相比,这是缓慢的)。首先将ListViewItems
放在List
中,完成后,将它们添加为数组,如下所示:
List<ListViewItems> list = new List<ListViewItems>();
Object myLock = new Object();
Parallel.For(0, 10000, (j,loopState) =>
{
int id1 = getid(names[j].ToString(), 101);
Parallel.For(0, 10000, (t,loopState1) =>
{
generate_firstACV5A(id1, nvisit(id1), names[j].ToString());
int id2 = getid(names[t].ToString(), 10000);
if (id1 == id2) { }
else
{
generate_firstACV5B(id2, nvisit(id2), names[t].ToString());
}
if (Enumerable.SequenceEqual(ACV5BFirst, ACV5Afirst) == true)
{
if (count == 0)
{
safecount++;
if (safecount == 4) {
ListViewItem it = new ListViewItem(getid(names[j].ToString(), 1000).ToString());
it.SubItems.Add(names[j].ToString());
lock (myLock )
{
list.Add(it);
}
loopState1.Break();
}
}
}
});
listView3.Items.AddRange(list.ToArray());
即使在Add期间锁定对列表的访问速度要快得多,然后使用大约1000个项目重新绘制listView。当我测试时,这种方法快了近10倍。