并行计算来加速for循环

十八道胡同 2020-02-27 05:26:22


foreach (antry gantryA in antrys)
{
foreach (antry gantryB in antrys)
{
if (gantryA == gantryB) continue;
//异步开始
//这里第一步调用C++写的dll,其中用gantryA 和gantryB做参数
//这里第二步把dll计算的返回值写txt里面
//异步结束
}
}

//最后把txt里面的内容手动导入数据库里面



antrys大约有3000,那个这个循环就得900万次左右,单线程顺序做的时间较久,我在想是否有办法把文字的第一步和第二步用异步的方式来完成?

我原来想用Task来完成,暂时没想哈咋写。。
...全文
1859 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
baifuqiushen 2020-03-02
  • 打赏
  • 举报
回复
很棒的文章啊啊啊
zerozerg2006 2020-03-02
  • 打赏
  • 举报
回复
引用 21 楼 学医之人的程序之旅 的回复:
[quote=引用 19 楼 u013962723的回复:]排个序,或者加一个数据结构,查询复杂度就成O(N)了,这种事情起多线程,是为了秀技术吗
排序就不需要复杂度了嘛,看不见的就不算了?[/quote] 所以我写的是查询复杂度
良朋 2020-03-02
  • 打赏
  • 举报
回复
//这里第二步把dll计算的返回值写txt里面。

CPU计算会是非常快的,写txt要牵扯到硬盘的机械运动了,那肯定是很慢了。如果是你用二进制流写还快一些,如果用调用API函数 [DllImport("kernel32")]来写TEXT,那就更慢了,慢了10倍都不止。
对象被抛出 2020-03-02
  • 打赏
  • 举报
回复
写成矩阵形式,用c++ openMP可以实现并行计算
十八道胡同 2020-03-02
  • 打赏
  • 举报
回复
引用 12 楼 Summer_djz 的回复:
慢的话应该慢在内部逻辑处理上,可以直接并行吧,就是不知道并行调用C++的dll有没有问题 Parallel.ForEach(antrys, (gantryA) => { foreach (antry gantryB in antrys) { if (gantryA == gantryB) continue; //异步开始 //这里第一步调用C++写的dll,其中用gantryA 和gantryB做参数 //这里第二步把dll计算的返回值写txt里面 //异步结束 } });
我试了下这个,基本的瓶颈在磁盘读写上了。 谢谢各位。
「已注销」 2020-03-01
  • 打赏
  • 举报
回复
多大的数据需要多线程处理!! 数据足够大优先使用PC模式队列处理
  • 打赏
  • 举报
回复
``` hello ```
luj_1768 2020-03-01
  • 打赏
  • 举报
回复
是否可以考虑使用大型机矩阵、向量算法?感觉每一步都是无法减少的,大家想的算法可能效果不大。
oXiaoc1234 2020-02-29
  • 打赏
  • 举报
回复
去查查Parallel.ForEach
足球中国 2020-02-29
  • 打赏
  • 举报
回复
引用 7 楼 qi_1213 的回复:
你这个逻辑执行就是有问题的,按你的逻辑要执行 3000*3000次,为什么不先排序再匹配,时间会缩短很多
并行不并行的差别并不大,但这个不排序问题就大了。
丁劲犇 2020-02-28
  • 打赏
  • 举报
回复
要是C++的话,果断openMP

#pragma omp parallel for
for (int i=0;i<100000;++i)
{
...
}
lijia66671977 2020-02-28
  • 打赏
  • 举报
回复
感觉都没搞清楚可以怎么把任务拆分
面向医学编程 2020-02-28
  • 打赏
  • 举报
回复
引用 19 楼 u013962723的回复:
排个序,或者加一个数据结构,查询复杂度就成O(N)了,这种事情起多线程,是为了秀技术吗
😂排序就不需要复杂度了嘛,看不见的就不算了?
牧歌ing 2020-02-28
  • 打赏
  • 举报
回复
慢的话应该慢在内部逻辑处理上,可以直接并行吧,就是不知道并行调用C++的dll有没有问题

Parallel.ForEach(antrys, (gantryA) =>
{
foreach (antry gantryB in antrys)
{
if (gantryA == gantryB) continue;
//异步开始
//这里第一步调用C++写的dll,其中用gantryA 和gantryB做参数
//这里第二步把dll计算的返回值写txt里面
//异步结束
}
});
十八道胡同 2020-02-28
  • 打赏
  • 举报
回复
引用 8 楼 秋的红果实 的回复:
异步的话,说不好,只好抽样测试了,比如取300条数据 做法可以:第一步的结果放到安全队列里(入队操作),第二步写txt(出队操作),寄希望于用存储换时间。 不知道你这3000是什么数据,要是图片、视频,那内存得跟得上 但我觉得效果不会很明显,说不定同步执行更快
3000 是个类。希望并行的部分是类的某字段参与调用第三方的dll。 你说的分2步的办法,可以试下。谢谢
yyc_ssasd 2020-02-28
  • 打赏
  • 举报
回复
3000*3000次的循环,对内存的要求很高
Bridge_go 2020-02-28
  • 打赏
  • 举报
回复
重复值多不多,可以先去除重复值
zerozerg2006 2020-02-28
  • 打赏
  • 举报
回复
排个序,或者加一个数据结构,查询复杂度就成O(N)了,这种事情起多线程,是为了秀技术吗
cghai001 2020-02-28
  • 打赏
  • 举报
回复
为什么要用for,是否可以使用linq来查询
秋的红果实 2020-02-27
  • 打赏
  • 举报
回复
异步的话,说不好,只好抽样测试了,比如取300条数据 做法可以:第一步的结果放到安全队列里(入队操作),第二步写txt(出队操作),寄希望于用存储换时间。 不知道你这3000是什么数据,要是图片、视频,那内存得跟得上 但我觉得效果不会很明显,说不定同步执行更快
加载更多回复(7)

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧