【问题标题】:Row wise parallel Processing in R?R中的逐行并行处理?
【发布时间】:2021-06-04 00:11:39
【问题描述】:

我正在处理大型数据集,为此我编写了一个代码来对数据帧执行逐行操作,这是顺序的。这个过程很慢。 我正在尝试使用并行处理来执行操作以使其更快。

这里是代码

library(geometry)

# Data set - a
data_a   = structure(c(10.4515034409741, 15.6780890052356, 12.5581992918563, 
                       9.19067944250871, 14.4459166666667, 11.414, 17.65325, 12.468, 
                       11.273, 15.5945), .Dim = c(5L, 2L), .Dimnames = list(c("1", "2", 
                       "3", "4", "5"), c("a", "b")))

# Data set - b
data_b   = structure(c(10.4515034409741, 15.6780890052356, 12.5581992918563, 
                       9.19067944250871, 14.4459166666667, 11.3318076923077, 13.132273830156, 
                       6.16003995082975, 11.59114820435, 10.9573192090395, 11.414, 17.65325, 
                       12.468, 11.273, 15.5945, 11.5245, 12.0249, 6.3186, 13.744, 11.0921), .Dim = c(10L, 
                       2L), .Dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10"), c("a", 
                       "b")))


conv_hull_1    <- convhulln( data_a, options = "FA")                        # Draw Convex Hull


test = c()


for (i in 1:nrow(data_b)){
  
  
  df = c()
  
  con_hull_all        <- inhulln(conv_hull_1,  matrix(data_b[i,], ncol = 2))
  
  df$flag             <- ifelse(con_hull_all[1] == TRUE , 0 , ifelse(con_hull_all[1] == FALSE , 1, 2))
  
  
  test                <- as.data.frame(rbind(test, df))
  
  print(i)
  
}

test

有没有办法并行化逐行计算?

如您所见,对于小型数据集,计算时间确实很短,但是一旦我增加数据大小,计算时间就会急剧增加。

您能否提供代码解决方案。 提前致谢。

【问题讨论】:

  • 努力制作完全可重复的示例。这些应该包含查看问题的所有代码。 inhullnconvhulln这两个函数从何而来?
  • @AndrewChisholm,对不起,我编辑了这个问题。你有什么解决办法吗?

标签: r parallel-processing rstudio convex-hull extrapolation


【解决方案1】:

您可以利用inhulln 函数的参数。这样可以传入多行要测试的点。

我已经在一个 320,000 行的矩阵上尝试了下面的代码,该矩阵由原始数据制成,速度很快。

library(geometry)
library(dplyr)
# Data set - a
data_a   = structure(
    c(
        10.4515034409741,
        15.6780890052356,
        12.5581992918563,
        9.19067944250871,
        14.4459166666667,
        11.414,
        17.65325,
        12.468,
        11.273,
        15.5945
    ),
    .Dim = c(5L, 2L),
    .Dimnames = list(c("1", "2",
                                         "3", "4", "5"), c("a", "b"))
)

# Data set - b
data_b   = structure(
    c(
        10.4515034409741,
        15.6780890052356,
        12.5581992918563,
        9.19067944250871,
        14.4459166666667,
        11.3318076923077,
        13.132273830156,
        6.16003995082975,
        11.59114820435,
        10.9573192090395,
        11.414,
        17.65325,
        12.468,
        11.273,
        15.5945,
        11.5245,
        12.0249,
        6.3186,
        13.744,
        11.0921
    ),
    .Dim = c(10L,
                     2L),
    .Dimnames = list(c(
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"
    ), c("a",
             "b"))
)

conv_hull_1    <- convhulln( data_a, options = "FA")                        # Draw Convex Hull

#Make a big data_b
for (i in 1:15) {
    data_b = rbind(data_b, data_b)
}
In_Or_Out <- inhulln(conv_hull_1, data_b)
result <- data.frame(data_b) %>% bind_cols(InOrOut=In_Or_Out)

我使用dplyr::bind_cols 将输入或输出结果绑定到原始数​​据的数据框版本,因此您可能需要针对特定​​环境进行一些更改。

【讨论】:

  • 我很清楚这个过程。我问这个问题是因为一旦我增加数据的维度(如果我使用 10 列而不是 2 列),这个过程就太慢了。我想以我的方式使用并行计算来测试 inhull 函数的潜力。 @安德鲁
  • 请您发布一些可以观察到减速的代表性数据吗?没有这个,响应者将对尺寸做出假设。我假设行数。您的新信息表明重要的是列数。
  • inhull 函数可以快速运行 5 列和 600 万行(计算时间约为 2 分钟)。一旦我增加到 10 列和 600 万行(计算时间太长,~ 3-4 天,我的代码仍然从过去 3 天开始运行)。 @安德鲁
  • 10列100000行需要多长时间?
  • 它也很长(约 3 小时)。我认为这与列数有关。我不知道如何解决这个@andrew
猜你喜欢
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多