问题描述:
我有一个大矩阵c
,装在RAM内存中.我的目标是通过并行处理对其进行只读访问.然而,当我创建的连接无论是我使用doSNOW
,doMPI
,big.matrix
等量显着地使用RAM而增加.
有没有办法正确创建共享内存,所有进程可以读取,而不创建所有数据的本地副本?
例:
libs<-function(libraries){# Installs missing libraries and then load them
for (lib in libraries){
if( !is.element(lib, .packages(all.available = TRUE)) ) {
install.packages(lib)
}
library(lib,character.only = TRUE)
}
}
libra<-list("foreach","parallel","doSNOW","bigmemory")
libs(libra)
#create a matrix of size 1GB aproximatelly
c<-matrix(runif(10000^2),10000,10000)
#convert it to bigmatrix
x<-as.big.matrix(c)
# get a description of the matrix
mdesc <- describe(x)
# Create the required connections
cl <- makeCluster(detectCores ())
registerDoSNOW(cl)
out<-foreach(linID = 1:10, .combine=c) %dopar% {
#load …
Run Code Online (Sandbox Code Playgroud) 我正试图从串行方法转向并行方法来完成一些大型的多变量时间序列分析任务data.table
.该表包含许多不同组的数据,我正在尝试使用该包从for
循环移动到循环以利用安装的多核处理器.foreach
doParallel
我遇到的问题与内存以及新R进程似乎消耗大量内存有关.我认为正在发生的事情是data.table
包含所有数据的大型数据被复制到每个新进程中,因此我用完RAM并且Windows开始交换到磁盘.
我创建了一个简化的可重现的示例,它复制了我的问题,但循环内部的数据更少,分析更少.如果存在的解决方案只能按需将数据分配给工作进程,或者共享核心之间已经使用的内存,那将是理想的选择.或者,可能已存在某种解决方案将大数据拆分为4个块并将其传递给核心,以便它们具有可用的子集.
之前已经在Stackoverflow上发布了类似的问题,但我无法使用提供的bigmemory
解决方案,因为我的数据包含字符字段.我将进一步研究这个iterators
方案,但是我很欣赏那些在实践中遇到这个问题经验的成员的建议.
rm(list=ls())
library(data.table)
num.series = 40 # can customise the size of the problem (x10 eats my RAM)
num.periods = 200 # can customise the size of the problem (x10 eats my RAM)
dt.all = data.table(
grp = rep(1:num.series,each=num.periods),
pd = rep(1:num.periods, num.series),
y = rnorm(num.series * num.periods),
x1 = rnorm(num.series * num.periods),
x2 = rnorm(num.series * num.periods)
) …
Run Code Online (Sandbox Code Playgroud) 我有一个data.frame的单元格,值和坐标.它驻留在全球环境中.
> head(cont.values)
cell value x y
1 11117 NA -34 322
2 11118 NA -30 322
3 11119 NA -26 322
4 11120 NA -22 322
5 11121 NA -18 322
6 11122 NA -14 322
Run Code Online (Sandbox Code Playgroud)
因为我的自定义函数花了将近一秒来计算单个单元格(我需要计算数万个单元格),我不想复制已经有值的单元格的计算.以下解决方案试图避免这种情况.每个单元格可以独立计算,尖叫为并行执行.
我的函数实际上做的是检查是否有指定单元格编号的值,如果它是NA,则计算它并将其插入代替NA.
我可以使用apply函数系列来运行我的魔术函数(结果是value
相应的cell
),从内部apply
,我可以读写cont.values
没有问题(它在全局环境中).
现在,我想并行运行(使用snowfall
),我无法从单个核心读取或写入此变量.
问题:在并行执行函数时,从工作者(核心)内部驻留在全局环境中的动态变量可以读取/写入什么解决方案.这样做有更好的方法吗?