R语言读取超大型文件,与pandas chunksize对比

readr包的使用

众所周知,R语言的readr包是个读取文件非常快速的包,广泛用来文本的读取。因为先前是使用python pandas进行数据处理,并且筛选过30G+的数据,这种超大的数据处理,小小的笔记本根本吃不消,会提示内存不够。所以在pandas里面,read_csv有个很好用的参数:low_memoryiterator

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效率差不多。

你可能感兴趣的:(R语言读取超大型文件,与pandas chunksize对比)