我是集群处理的新手,可以就如何更好地准备数据和/或从parallel包中调用函数提出一些建议。我已经阅读了parallels包装小插曲,所以对发生了什么有一个模糊的了解。
我要并行化的函数调用 2-D interpolation tool akima::interp。我的输入由 3 个矩阵(或向量 - 在 中都相同R)组成:一个包含 x 坐标,一个包含 y 坐标,一个包含“z”或数据值,用于一组样本点。 interp使用它在常规网格上生成插值数据,以便我可以绘制字段。一旦我设置了这 3 个项目,我将它们切成“块”并喂它们以逐块clusterApply执行。interp
我正在使用 Windows7、i7 CPU(8 核)机器。这是Rprof具有 1e6 个点(如果您愿意,可以为 1000x1000)的输入数据集的摘要输出,并映射到 1000x1000 输出网格。
所以我的问题是:1)“反序列化”似乎花费了大部分时间。这是什么操作,如何减少?2)一般来说,由于每个工作人员加载默认.Rdata文件,如果我首先将所有输入数据保存到.Rdata不需要传递给工作人员,是否会提高速度?3)还有什么我根本不知道我应该做不同的事情吗?
注意:这些sin, atan2, cos, +, max, min功能发生在clusterApply我打电话之前。
Rgames> summaryRprof('bigprof.txt')
$by.self
self.time self.pct total.time total.pct
"unserialize" 329.04 99.11 329.04 99.11
"socketConnection" 1.74 0.52 1.74 0.52
"serialize" 0.96 0.29 0.96 0.29
"sin" 0.06 0.02 0.06 0.02
"atan2" 0.04 0.01 0.06 0.02
"cos" 0.04 0.01 0.04 0.01
"+" 0.02 0.01 0.02 0.01
"max" 0.02 0.01 0.02 0.01
"min" 0.02 0.01 0.02 0.01
"row" 0.02 0.01 0.02 0.01
"writeLines" 0.02 0.01 0.02 0.01
$by.total
total.time total.pct self.time self.pct
"mcswirl" 331.98 100.00 0.00 0.00
"clusterApply" 330.00 99.40 0.00 0.00
"staticClusterApply" 330.00 99.40 0.00 0.00
"FUN" 329.06 99.12 0.00 0.00
"unserialize" 329.04 99.11 329.04 99.11
"lapply" 329.04 99.11 0.00 0.00
"recvData" 329.04 99.11 0.00 0.00
"recvData.SOCKnode" 329.04 99.11 0.00 0.00
"makeCluster" 1.76 0.53 0.00 0.00
"makePSOCKcluster" 1.76 0.53 0.00 0.00
"newPSOCKnode" 1.76 0.53 0.00 0.00
"socketConnection" 1.74 0.52 1.74 0.52
"serialize" 0.96 0.29 0.96 0.29
"postNode" 0.96 0.29 0.00 0.00
"sendCall" 0.96 0.29 0.00 0.00
"sendData" 0.96 0.29 0.00 0.00
"sendData.SOCKnode" 0.96 0.29 0.00 0.00
"sin" 0.06 0.02 0.06 0.02
"atan2" 0.06 0.02 0.04 0.01
"cos" 0.04 0.01 0.04 0.01
"+" 0.02 0.01 0.02 0.01
"max" 0.02 0.01 0.02 0.01
"min" 0.02 0.01 0.02 0.01
"row" 0.02 0.01 0.02 0.01
"writeLines" 0.02 0.01 0.02 0.01
"outer" 0.02 0.01 0.00 0.00
"system" 0.02 0.01 0.00 0.00
$sample.interval
[1] 0.02
$sampling.time
[1] 331.98