【问题标题】:R writing to stdout very slow. Any ways to improve?R 写入标准输出非常慢。有什么改进的方法吗?
【发布时间】:2015-03-09 02:11:15
【问题描述】:

我正在编写一个简单的命令行 Rscript,它读取一些二进制数据并将其作为数字字符流输出。数据具有特定格式,R 有一个非常快速的库来处理相关的二进制文件。文件(700 万个字符)被快速读取 - 不到一秒:

library(affyio)
system.time(CEL <- read.celfile("testCEL.CEL"))

user  system elapsed 
0.462   0.035   0.498

我想将部分读取数据写入标准输出:

str(CEL$INTENSITY$MEAN)
num [1:6553600] 6955 225 7173 182 148 ...

如您所见,它是大约 650 万个整数的数字数据。

而且写的很慢:

system.time(write(CEL$INTENSITY$MEAN, file="TEST.out"))
user  system elapsed 
8.953  10.739  19.694

(这里是对文件进行写入,但对 Rscript 的标准输出进行写入需要相同的时间”

cat(vector) 根本没有提高速度。我发现的一项改进是:

system.time(writeLines(as.character(CEL$INTENSITY$MEAN), "TEST.out"))
user  system elapsed 
6.282   0.016   6.298

它与读取数据时的速度仍然相去甚远(它读取的数据是这个特定向量的 5 倍)。此外,在继续之前,我需要将整个向量转换为字符。另外,当我下沉到标准输出时,如果我不小心无法将流重定向到文件,我无法使用 CTRL+C 终止流。

所以我的问题是 - 有没有更快的方法来简单地将数字向量从 R 输出到标准输出?

另外,为什么读取数据比写入快得多?这不仅适用于二进制文件,而且一般来说:

system.time(tmp <- scan("TEST.out"))
Read 6553600 items
user  system elapsed 
1.216   0.028   1.245 

【问题讨论】:

    标签: r stdout writetofile


    【解决方案1】:

    二进制读取速度很快。打印到标准输出很慢有两个原因:

    • 格式化
    • 实际打印

    您也可以进行基准测试/配置文件。但是,如果您真的想“快速”,请远离格式化以打印大量数据。

    编译后的代码有助于加快转换速度。但同样,最快的解决方案将是

    • 保留二进制
    • 不写入标准输出或文件(但使用例如 Redis 之类的东西)。

    【讨论】:

    • 感谢您的快速回复。您似乎说这实际上是不可能的,应该预计会很慢。我不太精通输入/输出流,所以如果下一个问题很愚蠢,请提前原谅我,但是:至少在原则上(使用 Rcpp 或类似的东西)是否可以解决这个问题。我在发布这个问题之前四处搜索,发现了一个用于 java 的 SO,他们声称在 0.3 秒内将 170mb csv 文件放入磁盘。
    • 二进制转二进制速度很快。二进制到其他东西需要时间。写ASCII需要时间。但不要相信任何人,而只是分析和衡量您的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 2015-11-19
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多