我是集群处理的新手,可以就如何更好地准备数据和/或从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