代码之家  ›  专栏  ›  技术社区  ›  89_Simple

用foreach函数并行计算

  •  0
  • 89_Simple  · 技术社区  · 6 年前

    我有一个文件夹,其中有5000个csv文件,每个文件属于一个位置,包含1980年至2015年的每日降雨量。文件结构示例如下:

    sample.file <- data.frame(location.id = rep(1001, times = 365 * 36), 
                          year = rep(1980:2015, each = 365),
                          day = rep(1:365, times = 36),
                          rainfall = sample(1:100, replace = T, 365 * 36))
    

    我想看一份文件,计算每年的总降雨量 并再次写入输出。我有多种方法可以做到这一点:

    方法1

    for(i in seq_along(names.vec)){
    
      name <- namees.vec[i]
      dat <- fread(paste0(name,".csv"))
    
      dat <- dat %>% dplyr::group_by(year) %>% dplyr::summarise(tot.rainfall = sum(rainfall))
    
     fwrite(dat, paste0(name,".summary.csv"), row.names = F)
    }
    

    my.files <- list.files(pattern = "*.csv")
    dat <- lapply(my.files, fread)
    dat <- rbindlist(dat)
    dat.summary <- dat %>% dplyr::group_by(location.id, year) %>% 
                   dplyr::summarise(tot.rainfall = sum(rainfall))
    

    方法3:

    foreach . 如何并行执行上述任务 使用 do parallel for each

    2 回复  |  直到 6 年前
        1
  •  2
  •   Bastien    6 年前

    下面是你的骨架 foreach request .

    require(foreach)
    require(doSNOW)
    cl <- makeCluster(10, # number of cores, don't use all cores your computer have
                      type="SOCK") # SOCK for Windows, FORK for linux
    registerDoSNOW(cl)
    clusterExport(cl, c("toto", "truc"), envir=environment()) # R object needed for each core
    clusterEvalQ(cl, library(tcltk)) # libraries needed for each core
    my.files <- list.files(pattern = "*.csv")
    foreach(i=icount(my.files), .combine=rbind, inorder=FALSE) %dopar% {
      # read csv file
      # estimate total rain
      # write output
    }
    stopCluster(cl)
    

    但是,当每次独立迭代的计算时间(CPU)高于其余的操作时,并行化就更好了。在您的情况下,改进可能很低,因为每个核心都需要有读写驱动器访问权限,而且写操作是物理操作,按顺序操作可能会更好(对于硬件来说更安全,最终在驱动器中为每个文件设置独立位置比为多个文件设置共享位置更有效,需要索引等等,以便在操作系统中区分它们--前面需要确认,这只是一个想法)。

    HTH公司

        2
  •  0
  •   Selcuk Akbas    6 年前

    pbapply包是最简单的并行方法

    library (pbapply)
    
    mycl <- makeCluster(4)
    mylist <- pblapply(my.files, fread, cl = mycl)