R代码性能监控

之前买的张丹的R极客理想的这本书想起来有R性能监控这部分的内容,学习了下。

1、Rprof

首先是R自带的Rprof包,不需要安装,直接导入即可

tmp = "tRprof.out"
Rprof(tmp, line.profiling= TRUE, memory.profiling=TRUE)
<R代码>
Rprof(NULL)
# 最后会生成一个tRprof.out文件,可以在R里面导入读取
summaryRprof("tRprof.out")
结果数据结构
  1. by.self: 这部分显示了每个函数自身执行所消耗的时间,不包括它调用的其他函数的时间。
  2. by.total: 这部分显示了包括调用其他函数在内的每个函数的总时间消耗。
  3. self.time: 函数自身执行的平均时间。
  4. total.time: 函数包括调用其他函数在内的平均总时间。
  5. percent.self: 每个函数自身时间消耗占总时间的百分比。
  6. percent.of.total: 每个函数总时间消耗占总时间的百分比。

2、profvis(旧的是lineprof)

安装:

conda install -c conda-forge pandoc  # 如果没有的话需要安装
R 
install.packages("profvis")

使用:

library(profvis)
profvis({
  # 你的代码块
})

这个更容易看资源消耗的情况,结果可以输出来一个html,示例:

library(profvis)
p<- profvis({
  my_cumsum2<- function(x){
    y<- numeric(length(x))
    y[[1]]<- x[[1]]
    for(i in 2:length(x)){
      y[[i]]<- y[[i-1]]+ x[[i]]
    }
    y
  }
  
  x<- rnorm(1000)
  
  for(i in 1:1000){
    my_cumsum2(x)
  }
})

htmlwidgets::saveWidget(p, "profile.html")
  1. 时间(Time):profvis中的时间单位通常是毫秒(ms)。这意味着,如果你看到某个函数或代码块的时间是100,那么它表示该函数或代码块执行了100毫秒。
  2. 内存(Memory):profvis中的内存单位通常是字节(bytes)。R语言中内存的使用量通常以字节为单位来表示,这可以帮助你了解代码在执行过程中的内存消耗情况。

但是发现对于复杂的脚本,以及消耗内存比较大的程序会跑的很慢很慢很慢,于是放弃了。

3、pidstat

最后选的是这个工具来对复杂脚本的消耗内存比较大的步骤进行了优化。
这个其实是linux监控程序运行的一个命令,只会输出系统时间间隔下的内存消耗情况。因此如果在R脚本中配合使用的话需要在代码中输出时间戳,可以在每个关键步骤的代码前后输出系统时间。最终就可以根据pidstat的输出日志,找到内存消耗最大的步骤了。
比如,R代码中:

print(paste0("-----------  FindNeighbors Start: ", date()))
#Cluster the cells
combined <- FindNeighbors(object = combined, reduction = "integrated.cca", dims = 1:dim)
print(paste0("-----------  FindNeighbors Start: ", date()))

FindNeighbors这行代码的开始和结束加上一个print, date()输出的就是系统时间。
任务投递之后会有一个pid,可以通过top查看。确定了pid后,立马运行如下命令:

# 这里示例的pid是129354
nohup pidstat -r -p 129354 10 > log &

参数含义

pidstat -r -p 270967 5
● pidstat: 是系统监控工具,属于sysstat包。
● -r: 报告内存使用情况
● -p 129354: 指定监控的进程ID(PID)为270967。
● 10: 每隔10秒刷新显示一次数据。

pidstat -r -p <pid>结果(log文件)

结果含义:
● 09时43分16秒: 显示数据的时间戳。
● UID: 运行进程的用户ID。
● PID: 进程ID。
● minflt/s: 每秒发生的次数,minor page faults不会引起磁盘I/O。
● majflt/s: 每秒发生的次数,major page faults会涉及磁盘I/O。
● VSZ: Virtual Set Size,虚拟内存大小,进程使用的虚拟内存总量。
● RSS: Resident Set Size,常驻内存大小,进程实际占用的物理内存量。
● %MEM: 进程占用的内存百分比。
● Command: 进程的命令名称。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容