在第二行的R WITH头中导入大的.CSV的滞后时间很长

时间:2014-07-23 21:30:04

标签: r csv bigdata

我正在开发一个从.csv中提取数据的应用程序,然后对其进行一些计算。挑战在于.csv的尺寸可能非常大。我在这里回顾了一些帖子,讨论了使用各种功能导入大型.csv文件的问题。库。下面是一些例子:

### size of csv file: 689.4MB (7,009,728 rows * 29 columns) ###

system.time(read.csv('../data/2008.csv', header = T))
#   user  system elapsed 
# 88.301   2.416  90.716

library(data.table)
system.time(fread('../data/2008.csv', header = T, sep = ',')) 
#   user  system elapsed 
#  4.740   0.048   4.785

library(bigmemory)
system.time(read.big.matrix('../data/2008.csv', header = T))
#   user  system elapsed 
# 59.544   0.764  60.308

library(ff)
system.time(read.csv.ffdf(file = '../data/2008.csv', header = T))
#   user  system elapsed 
# 60.028   1.280  61.335 

library(sqldf)
system.time(read.csv.sql('../data/2008.csv'))
#   user  system elapsed 
# 87.461   3.880  91.447

我遇到的挑战是这个。有问题的.csv在第二行有标题,第一行有无用的信息。我的初始方法(成功应用于小于5MB的较小文件)是在删除第一行后使用以下代码导入较小的文件。

report_query_X_all_content = readLines("C:/Users/.../report_queryX_XXX-XXX-XXXX.csv")
skip_first = report_query_X_all_content[-1]
report_query_X = read.csv(textConnection(skip_first), header = TRUE, stringsAsFactors = FALSE)

不幸的是,一旦基本文件的大小突破70或80MB,导入时间似乎呈指数级增长。我一直在看的大多数函数,比如fread(),都要求你直接传入.csv。正如您在我的实现中所看到的,在删除了我想要的行后,我通过textConnection传递了skip_first。我遇到的问题是,对于70或80MB的文件,存在不成比例的滞后时间。我差不多55分钟前开始进行一次导入,它仍在运行79MB文件。对于上下文,skip_first出现在内部存储器中,大小约为95MB。我的下一个导入大约是785MB。 有没有人对如何完成我想要处理更大的数据文件的任何建议或建议。最终,此解决方案将应用于大小为1 - 4 GB的.csv文件。我担心textConnection()步骤会导致瓶颈。

2 个答案:

答案 0 :(得分:5)

这是我最终选择的解决方案&这很好用:

start_time <- Sys.time() # Calculate time diff on the big files

library(bit64)

report_query_X <- fread('C:/Users/.../report_queryX_XXX-XXX-XXXX.csv', skip = 1, sep = ",")

end_time <- Sys.time() # Calculate time diff on the big files
time_diff <- end_time - start_time # Calculate the time difference
# time_diff = 1.068 seconds

对于78.9MB文件,此实施所需的总时间 1.068秒,这非常好。跳过fread()产生了巨大的变化。我最初使用fread()时收到了警告消息,注意到:

Warning message:
In fread("C:/Users/.../report_queryX_XXX-XXX-XXXX.csv",  :
  Some columns have been read as type 'integer64' but package bit64 isn't loaded. Those columns will display as strange looking floating point data. There is no need to reload the data. Just require(bit64) to obtain the integer64 print method and print the data again.

这就是为什么我最后使用install.packages(“bit64”)安装bit64,然后使用库函数调用它;库(bit64)


编辑:请注意,我刚尝试在251MB文件上使用此调用,总导入时间为1.844106秒。

答案 1 :(得分:2)

我会使用awk来解决这类问题。可以在R里面调用awk:

system("awk '{if (NR!=1) {print}}' a.csv > a2.csv")

其中a是您的示例文件,a2是删除了第一行的文件。