我有一个很大的数据集(大约500万个观测值)。观察记录通过“类型”表示的不同子事件类型记录的特定事件的总收入。数据的小复制如下:
Event_ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3)
Type=c("A","B","C","D","E","A","B","C","D","E","A","B","C","D")
Revenue1=c(24,9,51,7,22,15,86,66,0,57,44,93,34,37)
Revenue2=c(16,93,96,44,67,73,12,65,81,22,39,94,41,30)
z = data.frame(Event_ID,Type,Revenue1,Revenue2)
我想使用GPU内核来运行我编写的功能(我从未尝试过GPU处理,因此完全不知如何开始)。实际功能需要很长时间才能运行。我在下面显示了一个非常简单的函数版本:
Total_Revenue=function(data){
full_list=list()
event_list=unique(data[,'Event_ID'])
for (event in event_list){
new_data=list()
event_data = data[which(data$Event_ID==event),]
for (i in 1:nrow(event_data)){
event_data[i,'Total_Rev'] = event_data[i,'Revenue1']+event_data[i,'Revenue2']
new_data=rbind(new_data,event_data[i,])
}
full_list=rbind(full_list,new_data)
}
return(full_list)
}
Total = Total_Revenue(data=z)
print(Total)
此简化版本的功能如下:
a)将数据集分解为子集,以便每个子集仅发生1个唯一事件。
b)对于每个观察值,循环遍历所有观察值,并计算出Revenue1 + Revenue2。
c)存储子集,最后返回新数据集。
由于我之前没有经验,因此我正在研究某些R软件包。我找到并安装了gpuR软件包。。但是,我很难理解如何实现它。还有一个问题是我的编码背景非常薄弱。在过去的一年中,我自学了一些东西。
任何帮助/线索都将受到高度赞赏。我也愿意使用其他替代软件包。请让我知道是否错过了任何事情。
P.S。我还使用以下命令拍摄了系统快照:
str(gpuInfo())
我附上输出内容供您参考:
P.P.S。请注意,我的实际功能有些复杂且很长,并且运行时间很长,这就是为什么我要在此处实现gpu处理。
答案 0 :(得分:0)
GPU编程不是灵丹妙药。它仅对某些问题有效。这就是gpuR
包提供GPU基本向量和矩阵的原因,从而允许使用GPU完成线性代数运算。如果您的问题不是线性代数问题,这将无济于事。但是,请注意,可以通过这种方式制定许多问题。
由于您(可能)过度简化了代码,因此我们无法确定您的问题是否属于此类:
> print(Total)
Event_ID Type Revenue1 Revenue2 Total_Rev
1 1 A 24 16 40
2 1 B 9 93 102
3 1 C 51 96 147
4 1 D 7 44 51
5 1 E 22 67 89
6 2 A 15 73 88
7 2 B 86 12 98
8 2 C 66 65 131
9 2 D 0 81 81
10 2 E 57 22 79
11 3 A 44 39 83
12 3 B 93 94 187
13 3 C 34 41 75
14 3 D 37 30 67
由于Total_Rev
只是Revenue1
和Revenue2
的总和,因此您可以更轻松地做到这一点:
> z$Total_Rev <- z$Revenue1 + z$Revenue2
> z
Event_ID Type Revenue1 Revenue2 Total_Rev
1 1 A 24 16 40
2 1 B 9 93 102
3 1 C 51 96 147
4 1 D 7 44 51
5 1 E 22 67 89
6 2 A 15 73 88
7 2 B 86 12 98
8 2 C 66 65 131
9 2 D 0 81 81
10 2 E 57 22 79
11 3 A 44 39 83
12 3 B 93 94 187
13 3 C 34 41 75
14 3 D 37 30 67
这是向量化的一种简单形式,可帮助您摆脱for
循环。而且,由于外部for
循环着眼于不同的Event_ID
,因此研究分组和聚合技术也很有意义。这些可以通过基本R,data.table
软件包,tidyverse
/ dplyr
以及其他工具来完成。我使用后一种方法,因为我最喜欢它的语法,所以它是最新手的。但是,如果您有大量数据集,data.table
可能是适合您的工具。因此,这里有一个非常简单的汇总,用于计算每个Event_ID
的平均值:
Event_ID = c(1,1,1,1,1,2,2,2,2,2,3,3,3,3)
Type=c("A","B","C","D","E","A","B","C","D","E","A","B","C","D")
Revenue1=c(24,9,51,7,22,15,86,66,0,57,44,93,34,37)
Revenue2=c(16,93,96,44,67,73,12,65,81,22,39,94,41,30)
z = data.frame(Event_ID,Type,Revenue1,Revenue2)
library(dplyr)
z %>%
mutate(Total_Rev = Revenue1 + Revenue2) %>%
group_by(Event_ID) %>%
summarise(average = mean(Total_Rev))
#> # A tibble: 3 x 2
#> Event_ID average
#> <dbl> <dbl>
#> 1 1 85.8
#> 2 2 95.4
#> 3 3 103