问题描述
我目前正在尝试使用心脏和呼吸波形信号在 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。