假设我有一个矩阵bigm
。我需要使用此矩阵的随机子集并将其提供给机器学习算法,例如说svm
。矩阵的随机子集仅在运行时才知道。此外,还有其他参数也可以从网格中选择。
所以,我的代码看起来像这样:
foo = function (bigm, inTrain, moreParamsList) {
parsList = c(list(data=bigm[inTrain, ]), moreParamsList)
do.call(svm, parsList)
}
我想知道的是R是否使用新内存来保存parsList中的bigm[inTrain, ]
对象。 (我的猜测确实如此。)我可以使用哪些命令来测试这些假设?另外,有没有一种方法可以在不使用新内存的情况下在R中使用子矩阵?
编辑:
另外,假设我使用mclapply(在Linux上)调用foo
,其中bigm
位于父进程中。这是否意味着我正在制作mc.cores
bigm
份的副本,或者所有核心只使用来自父级的对象?
跟踪内存位置和在不同内核中生成的对象消耗的任何函数和启发式算法?
感谢。
答案 0 :(得分:1)
我将把我从这个主题的研究中找到的内容放在这里:
我不认为mclapply
使用mc.cores
根据bigm
的{{1}}手册制作multicore
份副本:
In a nutshell fork spawns a copy (child) of the current process, that can work in parallel
to the master (parent) process. At the point of forking both processes share exactly the
same state including the workspace, global options, loaded packages etc. Forking is
relatively cheap in modern operating systems and no real copy of the used memory is
created, instead both processes share the same memory and only modified parts are copied.
This makes fork an ideal tool for parallel processing since there is no need to setup the
parallel working environment, data and code is shared automatically from the start.
答案 1 :(得分:1)
对于问题的第一部分,您可以使用tracemem
:
此函数标记一个对象,以便在内部代码复制对象时打印一条消息
这是一个例子:
a <- 1:10
tracemem(a)
## [1] "<0x000000001669cf00"
b <- a ## b and a share memory (no message)
d <- stats::rnorm(10)
invisible(lm(d ~ a+log(b)))
## tracemem[0x000000001669cf00 -> 0x000000001669e298] ## object a is copied twice
## tracemem[0x000000001669cf00 -> 0x0000000016698a38]
untracemem(a)
答案 2 :(得分:1)
您已从手册中发现mclapply
不应复制bigm
。
但是每个线程都需要制作自己的较小训练矩阵的副本,因为它在线程中变化。
如果您要与snow
,您需要在每个群集节点中拥有数据的副本。但是,在这种情况下,您可以以只有较小的训练矩阵被移交的方式重写您的问题。
内存消耗行为一般调查的搜索术语是内存分析。不幸的是,AFAIK可用的工具还不是很舒服,例如。