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