【发布时间】:2017-10-10 14:43:23
【问题描述】:
我在 C 编程方面有很好的经验,而且我习惯于用指针来思考,所以在处理大量数据时我可以得到很好的性能。 R 就不一样了,我还在学习。
我有一个包含大约 100 万行的文件,用“\n”分隔,每行里面有 1、2 个或更多整数,用“”分隔。 我已经能够编写一个读取文件并将所有内容放入列表列表的代码。 有些行可以是空的。 然后,我想将每行的第一个数字(如果存在)放入一个单独的列表中,如果一行为空,则将其传递,其余数字放入第二个列表中。
我在这里发布的代码非常慢(自从我开始写这个问题以来它一直在运行,所以现在我杀了 R),我怎样才能获得不错的速度?在 C 中,这将立即完成。
graph <- function() {
x <- scan("result", what="", sep="\n")
y <- strsplit(x, "[[:space:]]+") #use spaces for split number in each line
y <- lapply(y, FUN = as.integer) #convert from a list of lists of characters to a list of lists of integers
print("here we go")
first <- c()
others <- c()
for(i in 1:length(y)) {
if(length(y[i]) >= 1) {
first[i] <- y[i][1]
}
k <- 2;
for(j in 2:length(y[i])) {
others[k] <- y[i][k]
k <- k + 1
}
}
在以前版本的代码中,每行至少有一个数字,并且我只对每行的第一个数字感兴趣,我使用了这段代码(我到处阅读,我应该避免使用 for 循环在 R 等语言中)
yy <- rapply(y, function(x) head(x,1))
这大约需要 5 秒,比上面的要好得多,但与 C 相比仍然烦人。
编辑 这是我文件前 10 行的示例:
42 7 31 3
23 1 34 5
1
-23 -34 2 2
42 7 31 3 31 4
1
【问题讨论】:
-
您的文件是 CSV 文件吗?另外,你能分享一下你的“数字”的例子吗?或许您可以说出哪些可能是您文件中的数字:“1 2”、“1 23”、“1 2 3”。
-
@PDE 不,它只是上述格式。我使用 C 程序自己生成文件。如果您愿意,我可以创建一个 CSV 文件,但我想从我的问题中学习代码。你写的所有数字都是有效的,准确地说,在我的情况下,我总是有从 -74 到 50 的数字,而且每行中的数字不超过 6 个。我不使用二进制格式,因为我想用 emacs 轻松处理数据
-
循环是唯一慢的部分?
-
@Moody_Mudskipper 是的
-
@Nisba 你也可以试试这个 StackOverflow 列表中的方法:stackoverflow.com/questions/8299978/…
标签: r performance