【发布时间】:2019-01-20 19:29:49
【问题描述】:
我有一个大型数据集(大约 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)对于每个观察,循环遍历所有观察并计算收入 1+收入 2。
c) 存储子集,最后返回新数据集。
由于我之前没有经验,所以我正在研究一些 R 包。我找到了 gpuR 包并安装了它。 但是,我很难理解如何实现它。另外问题是我的编码背景非常薄弱。在过去的一年里,我自学了一些东西。
任何帮助/线索将不胜感激。我也愿意使用任何替代包。如果我遗漏了什么,请告诉我。
附:我还使用以下命令对我的系统进行了快照:
str(gpuInfo())
我附上输出供您参考:
附言请注意,我的实际功能有点复杂和冗长,运行需要很长时间,这就是我想在这里实现 gpu 处理的原因。
【问题讨论】: