R csv.bz2 Shell Windows计算行数

时间:2014-05-27 10:20:09

标签: windows r shell csv

我在计算凌乱的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(),但前者崩溃,后者太慢,以至于我甚至不进一步考虑它。

我的问题是:

  1. 我可以使用哪种可靠的方法来计算csv.bz2文件中的行数?
  2. 使用公式直接计算csv.bz2文件中的行数而不解压缩它可以吗?
  3. 提前致谢,

1 个答案:

答案 0 :(得分:1)

罗兰从一开始就是对的 使用垃圾收集器时,仍然存在性能改善的错觉 我必须关闭重新开始 R 才能进行准确测试。
是的,在(红线)的几秒钟内,该过程仍然快一点,并且当使用 nrows 时,RAM消耗的增加更均匀。
但至少在这种情况下,尝试找到 read.csv()函数的优化是不值得的。
它很慢但它就是它 如果有人知道我感兴趣的更快的方法。
fread()崩溃以防万一。

感谢。


没有nrows(蓝线)

Sys.time()
system.time(storm.data <- read.csv(fileZip, 
                   header = TRUE,
                   stringsAsFactors = F,
                   comment.char = "",
                   colClasses = "character"))
Sys.time()
rm(storm.data)
gc()

使用nrows(红线)

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()

Time spent comparison

Ram consumption comparison