3.3 R语言性能可视化lineprof

问题

有没有一个可视化的性能监控工具?

R语言性能可视化lineprof

引言

数据可视化越来越受到人们的追捧,图形比文字更有表达力,基于HTML的可交互的图形比静态的PNG图片更让人惊喜。R语言已经为数据可视化做了充分的准备,比如,图形可视化包ggplot2,世界地图可视化包ggmap,股票可视化包quantmod ,基于HTML的可交互的可视化包googleVis等,简简单单的几行代码,就可以让数据变成图片,再让图片变成会动的图片。本节以“性能报告”为切入点,讲述R语言可视化包lineprof。

3.3.1 lineprof介绍

lineprof是一个数据可视化的项目,目标是更友好地可视化性能监控效果。3.2节通过profr库,可以把性能数据以图片的形式输出,但仅仅是一张静态图片。而lineprof可以做得更好,生成基于shiny的可交互的网页,让你自己动手发现问题。

lineprof项目也是Hadley Wickham的作品。目前项目只在github上面发布,项目地址是https://github.com/hadley/lineprof

lineprof的API介绍

lineprof库的API主要有以下两类函数。

功能函数:

  • focus: 设置显示高度zoom
  • auto_focus: 自动设置显示高度zoom
  • lineprof: 记录CPU和内存的占用
  • shine: 用shiny输出

内部函数:辅助功能函数

  • align: 源代码对齐
  • find_ex: 用于加载demo
  • line_profile: 格式化性能监控数据的输出(Rprof)
  • parse_prof: 格式化输出
  • reduce_depth: 设置输出的深度

3.3.2 lineprof安装

本节使用的系统环境是:

  • Linux: Ubuntu Server 12.04.2 LTS 64bit
  • R: 3.0.1 x86_64-pc-linux-gnu
  • IP: 192.168.1.201

注:lineprof只支持Linux环境。

由于项目lineprof还没有发布到CRAN,在lineprof包安装时,仅支持从github安装。所以,需要通过devtools包来安装github上面发布的R语言项目。

~ R                                  # 启动R程序
> library(devtools)                   # 加载devtools
> install_github("lineprof")           # 通过devtools工具,安装linepro
> install_github("shiny-slickgrid", "wch")  # 安装制定的shiny控制台
> library(lineprof)                            # 加载lineprof

3.3.3 lineprof使用

我们使用官方提供的例子,介绍lineprof包使用。

> source(find_ex("read-delim.r"))  # 加载脚本文件read-delim.r
> wine <- find_ex("wine.csv")      # 加载测试数据集
> x <- lineprof(read_delim(wine, sep = ","), torture = TRUE) # 执行read_delim算法,并通过lineprof记录性能指标
Zooming to read-delim.r (97% of total time)

对例子资源的介绍:

  • read-delim.r: 目标函数的脚本文件
  • wine.csv: 测试数据集
  • x: lineprof生成的数据报告

查看文件:read-delim.r。

function(file, header = TRUE, sep = ",", stringsAsFactors = TRUE) {
  # Determine number of fields by reading first line
  first <- scan(file, what = character(1), nlines = 1, sep = sep, quiet = TRUE)
  p <- length(first)
  # Load all fields
  all <- scan(file, what = as.list(rep("character", p)), sep = sep,
    skip = if (header) 1 else 0, quiet = TRUE)
  # Convert from strings to appropriate types
  all[] <- lapply(all, type.convert, as.is = !stringsAsFactors)
  # Set column names
  if (header) {
    names(all) <- first
    rm(first)
  } else {
    names(all) <- paste0("V", seq_along(all))
  }
  # Convert list into data frame
  class(all) <- "data.frame"
  attr(all, "row.names") <- c(NA_integer_, -length(all[[1]]))
  all
}

加载文件:wine.csv。

> df<-read.csv(file=wine)
> object.size(df)    # 数据集占内存大小
20440 bytes
> head(df,3)    # 显示前3行数据
  type alcohol malic  ash alcalinity magnesium phenols flavanoids nonflavanoids proanthocyanins color  hue dilution proline
1    A   14.23  1.71 2.43       15.6       127    2.80       3.06          0.28            2.29  5.64 1.04     3.92    1065
2    A   13.20  1.78 2.14       11.2       100    2.65       2.76          0.26            1.28  4.38 1.05     3.40    1050
3    A   13.16  2.36 2.67       18.6       101    2.80       3.24          0.30            2.81  5.68 1.03     3.17    1185

x对象: lineprof生成的数据报告

> x                           # 记录性能指标的对象
Reducing depth to 2 (from 8)
Common path:
    time alloc release dups      ref               src
1  0.002 0.001   0.000    0  #3 read_delim
2  0.049 0.009   0.003   11  #3 read_delim/scan
3  0.026 0.001   0.008    0  #4 read_delim
4  0.379 0.072   0.006   14  #7 read_delim/scan
5  0.003 0.000   0.000    0 #11 read_delim
6  0.106 0.015   0.030    3 #11 read_delim/lapply
7  0.008 0.004   0.000    3 #11 read_delim
8  0.210 0.028   0.077   36 #16 read_delim/rm
9  0.004 0.001   0.000    1 #22 read_delim
10 0.035 0.005   0.004    8 #23 read_delim/[[
11 0.002 0.000   0.000    1 #23 read_delim/length
12 0.001 0.000   0.000    1 #23 read_delim/c
13 0.006 0.004   0.000    1 #23 read_delim
14 0.001 0.000   0.000    0 #23 read_delim/attr<-

用shinySlickgrid库,把性能指标数据可视化,并以网页形式输出。

> library(shinySlickgrid)     # 加载shinySlickgrid库
> shine(x)                    # 启动shiny程序
Loading required package: shiny
Shiny URLs starting with /lineprof will mapped to /home/conan/R/x86_64-pc-linux-gnu-library/3.0/lineprof/www
Shiny URLs starting with /slickgrid will mapped to /home/conan/R/x86_64-pc-linux-gnu-library/3.0/shinySlickgrid/slickgrid
Listening on port 6742

shiny会自动在后台打开一个Web服务器,默认的Web访问端口是6742,之后就可以通过浏览器远程访问了。打开浏览器地址栏输入 http://192.168.1.201:6742 ,如图3-5所示。

可视化性能监控

图3-5 可视化性能监控

在图3-5中,网页的表格一共有6列,字段解释如下:

  • : 行号

  • source code: 监控的目标函数源代码
  • t: (total)当前行执行的总时间(秒)
  • r: (released) 释放内存量
  • a: (allocated) 分配内存量
  • d: (duplicates)重复次数

下面给出函数性能数据的解释。

  • 6(第6行),用于加载数据,总时间占用:0.309s,分配内存:0.064mb,方法重复次数:14次

  • 15(第15行),用于清除数据,总时间占用:0.179s,释放内存:0.065mb,方法重复次数:37次

通过lineprof可视化工具,我们生成的报告,更灵活,更直观,更好看,还有用户交互,甚至是网页版本的。如果再和3.2节R语言性能监控工具Rprof 的效果比较一下,你会惊叹R语言是如此强大,它的进步如此神速。当然,R语言具有无限的潜力,需要更多人来推动它进步,希望你也能给它助力。

results matching ""

    No results matching ""