在第二行的R WITH标头中导入大的.CSV的延迟时间很长
我正在开发一个应用程序,它从.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()步骤会导致瓶颈. 解决方法
这是我最终选择的解决方案&这很好用:
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秒. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |