作为一名程序员,我偶尔会发现需要分析大量数据,例如性能日志或内存使用数据,而且我总是很沮丧地花了多少时间做一些我希望更容易的事情.
作为将问题置于上下文中的示例,让我快速向您展示我今天收到的CSV文件中的示例(为简洁而严格过滤):
date,time,PS Eden Space used,PS Old Gen Used, PS Perm Gen Used
2011-06-28,00:00:03,45004472,184177208,94048296
2011-06-28,00:00:18,45292232,184177208,94048296
Run Code Online (Sandbox Code Playgroud)
我有大约100,000个像这样的数据点,我想在散点图中绘制不同的变量,以便查找相关性.通常,数据需要以某种方式进行处理以用于呈现目的(例如将纳秒转换为毫秒并舍入小数值),某些列可能需要添加或反转或组合(如日期/时间列).
这种工作的通常建议是R和我最近努力使用它,但经过几天的工作后,我的经验是我希望简单的大多数任务似乎需要很多步骤并且有特殊的例; 解决方案通常是非通用的(例如,将数据集添加到现有绘图中).它似乎是人们喜爱的那种语言之一,因为多年来积累的所有强大的库而不是核心语言的质量和实用性.
不要误解我的意思,我理解R对使用它的人的价值,只是因为我很少花时间在这种事情上,我认为我永远不会成为它的专家,而是非-expert每一项任务都变得过于繁琐.
Microsoft Excel在可用性方面非常出色,但它不足以处理大型数据集.此外,R和Excel都倾向于完全冻结(!)而不是等待或杀死进程,如果你不小心对太多数据做出错误的情节.
所以,堆栈溢出,你能推荐一些更适合我的东西吗?我不想放弃和开发自己的工具,我已经有足够的项目了.我喜欢互动的东西,可以使用硬件加速来绘制和/或剔除,以避免在渲染上花费太多时间.
@flodin您可以提供一个用于在此类文件中读取的代码示例.我经常使用您提到的大小的数据集,并且没有您提到的问题.如果你不经常使用R,可能会咬你的一件事是,如果你不告诉R什么是列类型R,它必须先对文件进行一些窥探,这一切都需要时间.看参数colClasses在?read.table.
对于您的示例文件,我会这样做:
dat <- read.csv("foo.csv", colClasses = c(rep("character",2), rep("integer", 3)))
Run Code Online (Sandbox Code Playgroud)
然后将date和time变量后处理到R日期时间对象类中POSIXct,例如:
dat <- transform(dat, dateTime = as.POSIXct(paste(date, time)))
Run Code Online (Sandbox Code Playgroud)
例如,让我们读取您的示例数据集,将其复制50,000次并将其写出来,然后按照不同的方式读取它,并foo包含您的数据:
> foo <- read.csv("log.csv")
> foo
date time PS.Eden.Space.used PS.Old.Gen.Used
1 2011-06-28 00:00:03 45004472 184177208
2 2011-06-28 00:00:18 45292232 184177208
PS.Perm.Gen.Used
1 94048296
2 94048296
Run Code Online (Sandbox Code Playgroud)
复制,50000次:
out <- data.frame(matrix(nrow = nrow(foo) * 50000, ncol = ncol(foo)))
out[, 1] <- rep(foo[,1], times = 50000)
out[, 2] <- rep(foo[,2], times = 50000)
out[, 3] <- rep(foo[,3], times = 50000)
out[, 4] <- rep(foo[,4], times = 50000)
out[, 5] <- rep(foo[,5], times = 50000)
names(out) <- names(foo)
Run Code Online (Sandbox Code Playgroud)
把它写出来
write.csv(out, file = "bigLog.csv", row.names = FALSE)
Run Code Online (Sandbox Code Playgroud)
时间加载天真的方式和正确的方式:
system.time(in1 <- read.csv("bigLog.csv"))
system.time(in2 <- read.csv("bigLog.csv",
colClasses = c(rep("character",2),
rep("integer", 3))))
Run Code Online (Sandbox Code Playgroud)
我的笔记本电脑上的速度非常快:
> system.time(in1 <- read.csv("bigLog.csv"))
user system elapsed
0.355 0.008 0.366
> system.time(in2 <- read.csv("bigLog.csv",
colClasses = c(rep("character",2),
rep("integer", 3))))
user system elapsed
0.282 0.003 0.287
Run Code Online (Sandbox Code Playgroud)
对于两种阅读方式.
至于绘图,图形可能有点慢,但根据你的操作系统,这可以通过改变你绘制的设备加快一点 - 例如,在Linux上,不要使用默认X11()设备,它使用开罗,而不是尝试没有抗锯齿的旧X窗口.另外,您希望在具有不多像素的图形设备上观察到大到100,000个观测数据集的数据集是什么?或许尝试重新考虑您的数据分析策略 - 没有统计软件可以帮助您避免做出不明智的事情.
听起来好像您正在开发代码/分析,在整个数据集上.在开发新代码或查看数据的新方法(例如1000行的随机样本)中使用一小部分数据时,更加明智,并使用该对象而不是整个数据对象.这样你就可以防止意外地做一些缓慢的事情:
working <- out[sample(nrow(out), 1000), ]
Run Code Online (Sandbox Code Playgroud)
例如.然后用working而不是出去.或者,在测试和编写脚本时,在调用中设置参数nrows以1000将数据加载到R中(参见参考资料?read.csv).这样,在测试时,您只读取数据的子集,但是一个简单的更改将允许您针对完整数据集运行脚本.
对于你正在讨论的大小的数据集,我认为使用R没有任何问题.你的观点是,关于不能成为使用R的专家,很可能适用于可能被建议的其他脚本语言,例如python.进入有一个障碍,但是如果你想要python或R等语言的强大功能,那就可以预料到了.如果你编写了很好的注释脚本(而不是只是插入命令行),并专注于一些关键的数据导入/操作,一些绘图和一些简单的分析,它应该不需要很长时间来掌握该语言的小子集.
R是一个很棒的工具,但我从来不必使用它.相反,当我需要从大型日志中提取数据时,我发现python足以满足我的需求.Python真的附带"包含电池",内置支持使用csv文件
读取CSV文件的最简单示例:
import csv
with open('some.csv', 'rb') as f:
reader = csv.reader(f)
for row in reader:
print row
Run Code Online (Sandbox Code Playgroud)
要使用其他分隔符,例如tab并提取第n列,请使用
spamReader = csv.reader(open('spam.csv', 'rb'), delimiter='\t')
for row in spamReader:
print row[n]
Run Code Online (Sandbox Code Playgroud)
要创建漂亮的图,我使用matplotlib
码
该蟒蛇教程是一个伟大的方式开始!如果你遇到困难,总会有stackoverflow ;-)