【发布时间】:2014-02-11 16:15:29
【问题描述】:
我正在使用相对较大的 data.table 数据集并尝试分析/优化代码。我正在使用Rprof,但我注意到在 setkey 操作中花费的大部分时间不包含在 Rprof 总结中。有没有办法包括这段时间?
这是一个小测试,显示 Rprof 摘要中没有显示为数据表设置键所花费的时间:
创建一个测试函数,在数据表上运行已分析的 setkey 操作:
testFun <- function(testTbl) {
Rprof()
setkey(testTbl, x, y, z)
Rprof(NULL)
print(summaryRprof())
}
然后创建一个足够大的测试数据表来感受setkey操作的权重:
testTbl = data.table(x=sample(1:1e7, 1e7), y=sample(1:1e7,1e7), z=sample(1:1e7,1e7))
然后运行代码,并将其包装在一个 system.time 操作中,以显示 system.time 总时间和 rprof 总时间之间的差异:
> system.time(testFun(testTbl))
$by.self
self.time self.pct total.time total.pct
"sort.list" 0.88 75.86 0.88 75.86
"<Anonymous>" 0.08 6.90 1.00 86.21
"regularorder1" 0.08 6.90 0.92 79.31
"radixorder1" 0.08 6.90 0.12 10.34
"is.na" 0.02 1.72 0.02 1.72
"structure" 0.02 1.72 0.02 1.72
$by.total
total.time total.pct self.time self.pct
"setkey" 1.16 100.00 0.00 0.00
"setkeyv" 1.16 100.00 0.00 0.00
"system.time" 1.16 100.00 0.00 0.00
"testFun" 1.16 100.00 0.00 0.00
"fastorder" 1.14 98.28 0.00 0.00
"tryCatch" 1.14 98.28 0.00 0.00
"tryCatchList" 1.14 98.28 0.00 0.00
"tryCatchOne" 1.14 98.28 0.00 0.00
"<Anonymous>" 1.00 86.21 0.08 6.90
"regularorder1" 0.92 79.31 0.08 6.90
"sort.list" 0.88 75.86 0.88 75.86
"radixorder1" 0.12 10.34 0.08 6.90
"doTryCatch" 0.12 10.34 0.00 0.00
"is.na" 0.02 1.72 0.02 1.72
"structure" 0.02 1.72 0.02 1.72
"is.unsorted" 0.02 1.72 0.00 0.00
"simpleError" 0.02 1.72 0.00 0.00
$sample.interval
[1] 0.02
$sampling.time
[1] 1.16
user system elapsed
31.112 0.211 31.101
注意 1.16 和 31.101 的时差。
阅读 ?Rprof,我明白为什么会出现这种差异:
函数只有在配置文件时才会记录在配置文件日志中 调用堆栈上的上下文(参见 sys.calls)。一些原始函数可以 不要这样做:特别是那些“特殊”类型的(见'R 内部人员手册了解更多详细信息)。
这就是为什么 Rprof 中没有表示在 setkey 操作中花费的时间的原因吗?是否有一种解决方法让 Rprof 监视所有 data.table 的操作(包括 setkey,也许还有我没有注意到的其他操作)?我基本上想让 system.time 和 Rprof 时间匹配。
这是最可能相关的 sessionInfo():
> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
data.table_1.8.11
当 Rprof() 不在函数调用中时,我仍然会观察到这个问题:
> testFun <- function(testTbl) {
+ setkey(testTbl, x, y, z)
+ }
> Rprof()
> system.time(testFun(testTbl))
user system elapsed
28.855 0.191 28.854
> Rprof(NULL)
> summaryRprof()
$by.self
self.time self.pct total.time total.pct
"sort.list" 0.86 71.67 0.88 73.33
"regularorder1" 0.08 6.67 0.92 76.67
"<Anonymous>" 0.06 5.00 0.98 81.67
"radixorder1" 0.06 5.00 0.10 8.33
"gc" 0.06 5.00 0.06 5.00
"proc.time" 0.04 3.33 0.04 3.33
"is.na" 0.02 1.67 0.02 1.67
"sys.function" 0.02 1.67 0.02 1.67
$by.total
total.time total.pct self.time self.pct
"system.time" 1.20 100.00 0.00 0.00
"setkey" 1.10 91.67 0.00 0.00
"setkeyv" 1.10 91.67 0.00 0.00
"testFun" 1.10 91.67 0.00 0.00
"fastorder" 1.08 90.00 0.00 0.00
"tryCatch" 1.08 90.00 0.00 0.00
"tryCatchList" 1.08 90.00 0.00 0.00
"tryCatchOne" 1.08 90.00 0.00 0.00
"<Anonymous>" 0.98 81.67 0.06 5.00
"regularorder1" 0.92 76.67 0.08 6.67
"sort.list" 0.88 73.33 0.86 71.67
"radixorder1" 0.10 8.33 0.06 5.00
"doTryCatch" 0.10 8.33 0.00 0.00
"gc" 0.06 5.00 0.06 5.00
"proc.time" 0.04 3.33 0.04 3.33
"is.na" 0.02 1.67 0.02 1.67
"sys.function" 0.02 1.67 0.02 1.67
"formals" 0.02 1.67 0.00 0.00
"is.unsorted" 0.02 1.67 0.00 0.00
"match.arg" 0.02 1.67 0.00 0.00
$sample.interval
[1] 0.02
$sampling.time
[1] 1.2
EDIT2:与我的机器上的 1.8.10 相同的问题,仅加载了 data.table 包。即使 Rprof() 调用不在函数内,时间也不相等:
> library(data.table)
data.table 1.8.10 For help type: help("data.table")
> base::source("/tmp/r-plugin-claytonstanley/Rsource-86075-preProcess.R", echo=TRUE)
> testFun <- function(testTbl) {
+ setkey(testTbl, x, y, z)
+ }
> testTbl = data.table(x=sample(1:1e7, 1e7), y=sample(1:1e7,1e7), z=sample(1:1e7,1e7))
> Rprof()
> system.time(testFun(testTbl))
user system elapsed
29.516 0.281 29.760
> Rprof(NULL)
> summaryRprof()
EDIT3:即使setkey 不在函数内也不起作用:
> library(data.table)
data.table 1.8.10 For help type: help("data.table")
> testTbl = data.table(x=sample(1:1e7, 1e7), y=sample(1:1e7,1e7), z=sample(1:1e7,1e7))
> Rprof()
> setkey(testTbl, x, y, z)
> Rprof(NULL)
> summaryRprof()
EDIT4:即使从--vanilla 基本终端提示符调用 R 也不起作用。
EDIT5:在 Linux VM 上测试时可以工作。但对我来说仍然无法在达尔文机器上工作。
EDIT6:在看到 Rprof.out 文件创建后不起作用,因此这不是写访问问题。
EDIT7:从源代码编译 data.table 并创建新的临时用户并在该帐户上运行后不起作用。
EDIT8:通过 MacPorts 从源代码为 darwin 编译 R 3.0.2 时不起作用。
EDIT9:可以在不同的 darwin 机器上工作,即运行相同操作系统版本 (10.6.8) 的 Macbook Pro 笔记本电脑。仍然无法在运行相同 OS 版本、R 版本、data.table 版本等的 MacPro 台式机上运行。
我认为这是因为台式机运行在 64 位内核模式(不是默认),而笔记本电脑是 32 位(默认)。 确认。
【问题讨论】:
-
我没有发现这个问题(windows 或 linux,R 3.0.1,dt 1.8.11) -
setkeyRprof和system.time时间对我来说非常匹配跨度> -
哦,鉴于您的编辑,您拥有 v1.8.11。我们仍在努力,我不知道您拍摄了哪个 v1.8.11 快照。更大的图景是什么?那么,您是否设计了这个测试来测试 v1.8.11 中的新改进?
-
@MattDowle 我正在使用 v1.8.11 b/c 我需要在大约一个月前为一个单独的项目执行此操作:
options(datatable.integer64="character") # Until integer64 setkey is implemented。我将恢复到 1.8.10 并重新测试。 -
哦,我明白了。在这种情况下,您不需要恢复到 1.8.10。只需在提示符处而不是在函数内部测试
Rprof()并确认它有效。 -
看到了编辑。如果
setkey不在函数内怎么办?
标签: r data.table