【问题标题】:How to run 8 million rows of data with `Parallel::mclapply` efficiently?如何使用 `Parallel::mclapply` 有效地运行 800 万行数据?
【发布时间】:2016-05-26 15:06:38
【问题描述】:

我尝试使用以下代码拆分大约 800 万个元素的字符向量

library(parallel)
detectCores()

s <- system.time({
    sepTime <- mclapply(orders_largest1stGroup$Time, function(x) x %>% strsplit(split = " ") %>% unlist() %>% strsplit(split = ":") %>% unlist(), mc.cores = 2) 
})

sepTime %>% unlist() %>% matrix(ncol=4, byrow=T) %>% as.data.frame()

向量orders_largest1stGroup$Time如下所示

"2016-01-01 13:37:23", "2016-01-02 16:37:23", "2016-01-03 12:37:23"

但是,15 多分钟过去了,它仍在运行。所以,我想知道我的代码或我的做法一定是不对的。

谁能看看并告诉我如何快速运行这段代码?

【问题讨论】:

    标签: r parallel-foreach


    【解决方案1】:

    我认为这会比 apply 方法更有效。

    dat <- c("2016-01-01 13:37:23", "2016-01-02 16:37:23", "2016-01-03 12:37:23")
    dat <- strptime(dat, format="%F %X") 
    date <- format(dat, "%F")
    hour <- format(dat, "%H")
    minute <- format(dat, "%M")
    seconds <- format(dat, "%S")
    

    如果您有兴趣优化流程,也许您可​​以将数据拆分为不同的子集,并使用 mclapply 或等效工具分别调整每个集合。

    【讨论】:

    • 你说得对,分成几个小组,帮我忍受等待时间。谢谢
    【解决方案2】:

    拆分这 800 万行 data.frame 的更有效解决方案: largeData$Time 是一个字符串向量,如

    "2016-01-01 13:37:23", "2016-01-02 16:37:23", "2016-01-03 12:37:23"
    

    要在 30 秒内拆分它们,请执行此操作而不是 for 循环:

    largeData %>% mutate(Date=Time %>% substr(1,10) %>% as.Date(), Hour=Time %>% substr(12,13) %>% as.numeric(), Minute=Time %>% substr(15,16) %>% as.numeric())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-22
      • 2013-12-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多