5

假设我有一个矩阵bigm。我需要使用该矩阵的一个随机子集并将其提供给机器学习算法,例如 say svm。矩阵的随机子集只会在运行时知道。此外,还有其他参数也可以从网格中选择。

所以,我的代码看起来像这样:

foo = function (bigm, inTrain, moreParamsList) {
  parsList = c(list(data=bigm[inTrain, ]), moreParamsList)
  do.call(svm, parsList)
}

我想知道的是 R 是否使用新内存将该bigm[inTrain, ]对象保存在 parsList 中。(我的猜测是确实如此。)我可以使用哪些命令来自己测试这些假设?此外,有没有办法在 R 中使用子矩阵而不使用新内存?

编辑:

另外,假设我正在使用驻留在父进程中的foomclapply(在 Linux 上)进行调用。bigm这是否意味着我正在制作mc.cores多个副本,bigm或者所有核心都只使用来自父级的对象?

跟踪内存位置和在不同内核中制作的对象的消耗的任何功能和启发式方法?

谢谢。

4

3 回答 3

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)
于 2013-10-17T09:08:30.823 回答
1

我将在这里输入我从对该主题的研究中发现的内容:

我不认为 using会根据手册中的以下内容mclapply制作mc.cores副本:bigmmulticore

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.
于 2013-10-17T08:20:22.527 回答
1

您已经从手册中找到mclapply不应该复制bigm. 但是每个线程都需要制作自己的较小训练矩阵的副本,因为它在线程中会有所不同。

如果您要与 eg 并行化,snow则需要在每个集群节点中拥有数据的副本。但是,在这种情况下,您可以以仅移交较小的训练矩阵的方式重写您的问题。

对内存消耗行为的一般调查的搜索词是内存分析。不幸的是,AFAIK 可用的工具(还)不是很舒服,见例如

于 2013-10-17T09:15:32.350 回答