RQA 的多核使用/并行化映射函数

问题描述

我目前正在尝试使用心脏和呼吸波形信号在 R 中运行窗口化 CRQA。我必须运行 94 个窗口化 CRQA,其中每个信号有 20000 - 50000 个数据点。因此,计算负载相对较高并且需要很长时间。因此,我试图让 R 增加内存大小并使用多个内核。这似乎不适用于以下代码

library(parallel)
library(doParallel) 
library(crqa)
gc()
# Set Memory Size (PC has 16000 RAM)
memory.limit(size = 17000)
memory.size(max=TRUE)

numCores <- detectCores() # core = 11

# Simulate Example Data
HR1 = c(arima.sim(list(order=c(1,2),ar=-0.6,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=40000))
HR2 = c(arima.sim(list(order=c(1,ar=-0.7,n=20000))
HR3 = c(arima.sim(list(order=c(1,ar=-0.8,n=30000))

RR1 = c(arima.sim(list(order=c(1,ar=-0.4,n=40000))
RR2 = c(arima.sim(list(order=c(1,ar=-0.3,n=20000))
RR3 = c(arima.sim(list(order=c(1,ar=-0.2,n=30000))

HR_list = list(HR1,HR2,HR3)
RR_list = list(RR1,RR2,RR3)

# Create Cluster
cl <- makeCluster(detectCores(),type='PSOCK')
registerDoParallel(cl)

# Run the Windowed CRQA
start_time <- Sys.time()
WCRQA_list = Map(function(x,y)
  wincrqa(ts1 = x,ts2 = y,windowstep = 1000,windowsize = 2000,radius = .2,delay = 4,embed = 2,rescale = 0,normalize = 0,mindiagline = 2,minvertline = 2,tw = 0,whiteline = F,side = "both",method = "crqa",metric = "euclidean",datatype = "continuous"),HR_list,RR_list)
end_time <- Sys.time()
end_time - start_time

registerDoSEQ()

为什么 R 不回收它实际上可以回收的内存大小和内核?在任务管理器中检查它,两者似乎都不起作用。 我如何解决这个问题才能在我的实际数据集上实际运行这段代码

我愿意接受任何帮助。

最好的, 约翰逊

解决方法

您需要使用 clusterMap()parallel 包中的其他函数而不是 base::Map

查找这些选项:?parallel::clusterMap

您目前还通过引入来自 registerDoParallel(cl) 包的 foreach 来混淆事物。这将要求您使用 foreach() 及其助手 %dopar%。如果您不使用 foreach(),则不需要 registerDoParallel(cl)

您的代码的相关部分与 clusterMap() 类似。我已经整理了一下,但我无法在我的机器上测试它。

my_wincrqa <-function(x,y) {

crqa::wincrqa(ts1 = x,ts2 = y,windowstep = 1000,windowsize = 2000,radius = .2,delay = 4,embed = 2,rescale = 0,normalize = 0,mindiagline = 2,minvertline = 2,tw = 0,whiteline = F,side = "both",method = "crqa",metric = "euclidean",datatype = "continuous")

}

WCRQA_list = clusterMap(cl,my_wincrqa,HR_list,RR_list)

通常,最好先在较小的范围内进行测试。这对于并行计算来说可能更为重要,考虑到并行计算在 R for Windows 上工作是多么痛苦,更是如此。查看 this self-answered question 以设置快速测试。 snow 现在基本上是 parallel AFAIK。