R语言mclapply等并行方案执行效率低于串行for循环问题咨询
并行抽取日期任务效率低于串行的问题解答
现象合理性判定
你遇到的并行版本执行耗时高于串行版本的情况,属于完全正常的现象。
核心原因分析
你的推测完全正确,核心诱因就是单任务执行时间过短,进程通信开销抵消了并行收益,具体细节如下:
- 按周随机抽取日期属于极轻量计算任务:单次执行仅涉及日期格式转换、随机数生成、结果取值几个简单步骤,单轮耗时普遍在微秒级,远低于进程通信的基础开销
parallel包的mclapply、foreach+doParallel这类多进程并行框架,执行任务前需要完成主进程向工作进程分发参数、序列化/反序列化数据,任务结束后回传结果的全流程,仅单次通信开销就普遍达到毫秒级,比单任务执行耗时高出2~3个数量级,累加后整体耗时自然高于串行执行- 不同框架的序列化开销不同,
foreach的通信 overhead 通常高于mclapply,所以会出现foreach版本耗时更差的情况
优化建议
如果要实现并行收益,需要做粗粒度的任务拆分:不要把每周的抽取拆成独立子任务,而是把所有待处理的周先拆分为和CPU核心数相等的大组,每个工作进程一次性处理一整组的抽取任务,将通信次数从数百上千次降到和核心数一致,就能抵消通信开销拿到并行加速效果。
内容的提问来源于stack exchange,提问作者Nicolas Molano
相关产品推荐
相关产品推荐

