readr包的使用
众所周知,R语言的readr包是个读取文件非常快速的包,广泛用来文本的读取。因为先前是使用python pandas进行数据处理,并且筛选过30G+的数据,这种超大的数据处理,小小的笔记本根本吃不消,会提示内存不够。所以在pandas里面,read_csv有个很好用的参数:low_memory和iterator。
Pandas读取大文件思路
因为我并不需要同时载入超过内存大小的数据,而是需要从大文件中筛选出我需要的数据。因此可以分块读取,筛选完这一部分后,释放内存,读取下一个块,这样直至读完。把所有筛出来的数据保存为新的文件。
import pandas as pd
import time #载入time包,用于统计计算耗时
df1 = pd.read_csv('Data.csv',low_memory = False, iterator = True)
loop = True
n = 0
start = time.time()
df4 = pd.DataFrame()
while loop:
try:
n += 1
df2 = df1.get_chunk(1000000)
df3 = df2.loc[(df2['??'] == ???] #根据自己的数据筛选
if n == 1:
df3.to_csv(r'data.csv',mode = 'a',index = False,header = True)
else:
df3.to_csv(r'data.csv',mode = 'a',index = False,header = False)
except StopIteration:
loop = False
print('Iteration is stopped')
end = time.time()
stay = (int(end - start))/60
print('{:.2f} min'.format(stay))
使用以上代码可以筛选任意大小的csv文件。
R语言中如何操作
最近从python转到R,想把操作都转过来,查阅网上资料,很少有说这个问题的,但翻阅google后,还是找到了类似的办法。
library(readr)
rm(list = ls()) #移除所有变量
ptm <- proc.time() #用于计算读取耗时
f <- function (x,pos){
subset(x,?? == ???)
} #定义筛选条件
df <- read_csv_chunked(file = "data.csv", DataFrameCallback$new(f), chunk_size = 2000000,col_names = TRUE, progress = FALSE)
t <- proc.time() - ptm
print(t)
write_excel_csv(df,"E:\\2.csv")
readr包的read_csv_chunked()函数就是用来分块读取的,并且DataFrameCallback$new(f)可以返回所有筛选的综合数据框。并且和pandas效率差不多。