我正在重写这个问题以澄清我在寻找什么
我想在 RStudio 中监控我的内存使用情况,以便我可以避免在集群上出现内存不足错误。我正在寻找一种计算峰值内存使用量的方法,其中包括 global variables 和 local variables。例如,峰值内存使用量应该考虑函数和应用循环中的中间变量。
编辑:此赏金即将到期,但我仍然没有找到我要找的东西。我想要一些可以连续监控内存使用情况的东西,而不仅仅是打印到控制台。
gc(reset = T)
sum(gc()[, "(Mb)"]) # 172Mb
lapply(1:3, function(x) {
mx <- replicate(10, rnorm(1e6)) # 80Mb object
mean(mx)
})
sum(gc()[, "(Mb)"]) # 172Mb -- still the same!
Run Code Online (Sandbox Code Playgroud) 我在R中有大对象,几乎不适合我的16GB内存(一个data.table> 4M记录的数据库,> 400个变量).
我想要一个哈希函数,用于确认加载到R中的数据库没有被修改.
一种快速的方法是使用先前存储的哈希计算数据库的哈希值.
问题是digest::digest函数复制(序列化)数据,并且只有在序列化所有数据之后,它才会计算散列.这对我的硬件来说太迟了...... :-(
有没有人知道解决这个问题的方法?
有一个穷人的解决方案:将对象保存到文件中,并计算文件的哈希值.但是它引入了大量不必要的开销(我必须确保硬盘上有备用的另一个副本,并且需要跟踪所有可能无法自动删除的文件)
在包含对data.table函数调用的R代码中分析内存的正确方法是什么?假设我要确定表达式期间的最大内存使用量。
该参考文献表明Rprofmem可能不是正确的选择:https :
//cran.r-project.org/web/packages/profmem/vignettes/profmem.html
记录通过R的本机API的本机allocVector3()部分完成的所有内存分配,这意味着几乎所有的内存分配都被记录。R的垃圾收集器会在某些时候自动释放所有以这种方式分配的对象。profmem()不会记录垃圾收集事件。未记录的分配是由非R本机库或将内部代码Calloc()/ Free()用于内部对象的R包完成的分配。R垃圾收集器不处理此类对象。
data.table源代码包含对的大量调用Calloc(),malloc()因此这表明这Rprofmem将无法衡量data.table函数分配的所有内存。如果Rprofmem不是正确的工具,那么Matthew Dowle怎么在这里使用它:R:循环遍历data.table中的列?
我发现了一个参考文献,提出了类似的潜在问题gc()(可用于测量两次调用之间的最大内存使用量gc()):https :
//r.789695.n4.nabble.com/Determining-the-maximum-memory-usage -of-a-function-td4669977.html
gc()是一个好的开始。在任务执行之前调用gc(reset = TRUE),在执行任务之后调用gc(),您会在此期间看到R占用的最大额外内存。(这不包括编译后的代码分配的内存,这在重新使用时很难测量。)
我没有发现任何暗示存在类似问题Rprof(memory.profiling=TRUE)。这是否意味着即使不总是使用R API分配内存,该Rprof方法data.table仍然适用?
如果Rprof(memory.profiling=TRUE)实际上不是该工作的正确工具,那是什么?
会ssh.utils::mem.usage工作吗?
假设我有一个矩阵bigm.我需要使用这个矩阵的随机子集并将其提供给机器学习算法,比如说svm.矩阵的随机子集仅在运行时才知道.此外,还有其他参数也可以从网格中选择.
所以,我的代码看起来像这样:
foo = function (bigm, inTrain, moreParamsList) {
parsList = c(list(data=bigm[inTrain, ]), moreParamsList)
do.call(svm, parsList)
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是R是否使用新内存bigm[inTrain, ]在parsList中保存该对象.(我的猜测确实如此.)我可以使用哪些命令来测试这些假设?另外,有没有一种方法在不使用新内存的情况下在R中使用子矩阵?
编辑:
另外,假设我foo使用mclapply(在Linux上)调用bigm驻留在父进程中.这是否意味着我正在制作mc.cores副本bigm或所有核心只使用父级的对象?
跟踪内存位置和在不同内核中生成的对象消耗的任何功能和启发式算法?
谢谢.
编织R markdown文件时,我常常发现自己盯着Markdown输出等待一个块完成.不幸的是,我不知道有什么方法可以看到该块当前正在执行什么命令.这对于了解进度或找到性能瓶颈非常方便.
我错过了一些针织选项吗?设置progress=TRUE, verbose=TRUE只显示执行该块之前的块代码.我希望每行代码在执行之后/之前显示在控制台中,就像在交互式会话中一样.
我在 R 中有一个列表,my_list2如下例所示。
我想以最小化峰值 RAM 使用的方式将项目添加到列表中。
有没有比使用该append函数更节省内存的方法?
我知道最好的做法是创建一个“空”列表,然后按照my_list2下面的示例填充它,但这不是一个选项,因为该列表已经存在。
# If I could create the list from scratch I'd do it list this:
my_list <- vector('list', 10)
for (i in 1:10) {
my_list[[i]] <- i
}
# Is there a better way than the 'append' function?
my_list2 <- list(1)
for (i in 2:10) {
my_list2 <- append(my_list2, i)
}
Run Code Online (Sandbox Code Playgroud)