R:加速代码,多核

R:加速代码,多核,r,parallel-processing,multicore,R,Parallel Processing,Multicore,我的R代码的性能有问题。 我的代码很慢。我必须循环3000个元素的向量。在每个循环中,我调用许多函数。 我首先尝试了并行化,但没有成功。在每个步骤中,我都需要前面步骤的结果。 现在我有了一个想法:我将向量分成3块1000个元素。并自行对每一件进行计算。关于第1部分和第2部分的第一个元素,我会有一个问题,但我能处理它。 我想通过一个单独的CPU核心来计算这3个部件中的每一个。 实际上,我可以创建3.R文件,启动3个R会话(=3个内核)并计算它。 但是我想把它放在一个文件里。我想定义一下,我的第一个

我的R代码的性能有问题。 我的代码很慢。我必须循环3000个元素的向量。在每个循环中,我调用许多函数。 我首先尝试了并行化,但没有成功。在每个步骤中,我都需要前面步骤的结果。 现在我有了一个想法:我将向量分成3块1000个元素。并自行对每一件进行计算。关于第1部分和第2部分的第一个元素,我会有一个问题,但我能处理它。 我想通过一个单独的CPU核心来计算这3个部件中的每一个。 实际上,我可以创建3.R文件,启动3个R会话(=3个内核)并计算它。 但是我想把它放在一个文件里。我想定义一下,我的第一个循环将由核1计算,而其他循环则由其他核计算

可能吗? 多谢各位

这是一个简单的例子。它描述了我的问题

#Situation now  
vec3000 <- rnorm(3000)
result3000 <- rep(NA, length(vec3000))
for (i in 1 : 3000){
    if (i == 1){
        result3000[i] <- vec3000[i]
    }else{
        result3000[i] <- result3000[i - 1] + vec3000[i]
    }
}

#New Situation
vec1000_1 <- vec3000[1:1000]
vec1000_2 <- vec3000[1001:2000]
vec1000_3 <- vec3000[2001:3000]
result1000_1 <- rep(NA, 1000)
result1000_2 <- rep(NA, 1000)
result1000_3 <- rep(NA, 1000)

#Calculated by Core 1
for (i in 1 : 1000){
    if (i == 1){
        result1000_1[i] <- vec1000_1[i]
    }else{
        result1000_1[i] <- result1000_1[i - 1] + vec1000_1[i]
    }
}

#Calculated by Core 2
for (i in 1 : 1000){
    if (i == 1){
        result1000_2[i] <- vec1000_2[i]
    }else{
        result1000_2[i] <- result1000_2[i - 1] + vec1000_2[i]
    }
}   

#Calculated by Core 3
for (i in 1 : 1000){
    if (i == 1){
        result1000_3[i] <- vec1000_3[i]
    }else{
        result1000_3[i] <- result1000_3[i - 1] + vec1000_3[i]
    }
}
#现在的情况

vec3000下面是一个使用foreach包的示例,该包并行处理向量块:

library(doParallel)
library(itertools)
nworkers <- 3
cl <- makePSOCKcluster(nworkers)
registerDoParallel(cl)
vec3000 <- rnorm(3000) # dummy input

# This computes "resvecs" which is a list of "nworkers" vectors
resvecs <- foreach(vec=isplitVector(vec3000, chunks=nworkers)) %dopar% {
    result <- double(length=length(vec))
    for (i in seq_along(result)) {
        if (i == 1) {
            result[i] <- vec[i]
        } else {
            result[i] <- result[i - 1] + vec[i]
        }
    }
    result
}
库(双并行)
图书馆(itertools)

nworkers请提供一个最小的可复制示例,以便其他人可以更轻松地提供帮助。您将得到更好/更快的答案,更适合您的特定问题。是的,这是可能的:请参阅
parallels
包以获取一个示例。这是否是减少处理时间的最佳方法是未知的,因为您没有发布函数或所需的输出。很可能有更好的方法来计算您想要的结果。
result1000_1=cumsum(vec1000_1)
速度很快,无需浪费时间并行低效的代码。您有没有尝试过并行运行此方法?我知道我可以在这里使用cumsum。但这是一个例子。我的问题更复杂。我并没有同时尝试这个例子。但我的示例产生了一个错误:{:task 1失败--“S4”类型的Objekt…谢谢。您的示例非常完美。