在第二行的R WITH标头中导入大的.CSV的延迟时间很长

Nat*_*yne 5 csv r 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
Run Code Online (Sandbox Code Playgroud)

我遇到的挑战是这个.有问题的.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)
Run Code Online (Sandbox Code Playgroud)

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

Nat*_*yne 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
Run Code Online (Sandbox Code Playgroud)

对于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.
Run Code Online (Sandbox Code Playgroud)

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


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