我在计算凌乱的csv.bz2文件中的行数时出现问题。
由于这是一个巨大的文件,我希望能够在使用read.csv()函数读取bzip2文件之前预先分配数据帧。
正如您在以下测试中所看到的,我的结果变化很大,并且没有一个与csv.bz2文件中的实际行数相对应。
> system.time(nrec1 <- as.numeric(shell('type "MyFile.csv" | find /c ","', intern=T)))
user system elapsed
0.02 0.00 53.50
> nrec1
[1] 1060906
> system.time(nrec2 <- as.numeric(shell('type "MyFile.csv.bz2" | find /c ","', intern=T)))
user system elapsed
0.00 0.02 10.15
> nrec2
[1] 126715
> system.time(nrec3 <- as.numeric(shell('type "MyFile.csv" | find /v /c ""', intern=T)))
user system elapsed
0.00 0.02 53.10
> nrec3
[1] 1232705
> system.time(nrec4 <- as.numeric(shell('type "MyFile.csv.bz2" | find /v /c ""', intern=T)))
user system elapsed
0.00 0.01 4.96
> nrec4
[1] 533062
最有趣的结果是我称之为nrec4的结果,因为它没有时间,并且它返回大约nrec1行数的一半,但我完全不确定2的天真乘法是否正常。< / p>
我已经尝试过其他几种方法,包括fread()和hsTableReader(),但前者崩溃,后者太慢,以至于我甚至不进一步考虑它。
我的问题是:
提前致谢,
迭
答案 0 :(得分:1)
感谢。
Sys.time()
system.time(storm.data <- read.csv(fileZip,
header = TRUE,
stringsAsFactors = F,
comment.char = "",
colClasses = "character"))
Sys.time()
rm(storm.data)
gc()
Sys.time()
system.time(nrec12 <- as.numeric(
shell('type "MyFile.csv.bz2" | find /v /c ""',
intern=T)))
nrec12 <- nrec12 * 2
system.time(storm.data <- read.csv(fileZip,
stringsAsFactors = F,
comment.char = "",
colClasses = "character",
nrows = nrec12))
Sys.time()
rm(storm.data)
gc()