RQA 的多核 Usage/Parallelize 映射函数

Multiple Core Usage/Parallelize Map Function for an 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,0,2),ar=-0.6,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=40000))
HR2 = c(arima.sim(list(order=c(1,0,2),ar=-0.7,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=20000))
HR3 = c(arima.sim(list(order=c(1,0,2),ar=-0.8,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=30000))

RR1 = c(arima.sim(list(order=c(1,0,2),ar=-0.4,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=40000))
RR2 = c(arima.sim(list(order=c(1,0,2),ar=-0.3,ma=c(0.5,-0.7)),sd=sqrt(0.5),n=20000))
RR3 = c(arima.sim(list(order=c(1,0,2),ar=-0.2,ma=c(0.5,-0.7)),sd=sqrt(0.5),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

您目前还通过引入来自 foreach 包的 registerDoParallel(cl) 来混淆事物。这将要求您使用 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。