pandas高效读取大文件的探索之路.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

pandas高效读取大文件的探索之路

使用pandas进行数据分析时,第一步就是读取文件。

在平时学习和练习的过程中,用到的数据量不会太大,所以读取文件的步骤往往会被我们忽视。

然而,在实际场景中,面对十万,百万级别的数据量是家常便饭,即使千万,上亿级别的数据,单机处理也问题不大。

不过,当数据量和数据属性多了之后,读取文件的性能瓶颈就开始浮现出来。

当我们第一次拿到数据时,经常会反反复复的读取文件,尝试各种分析数据的方法。

如果每次读取文件都要等一段时间,不仅会影响工作效率,还影响心情。

下面记录了我自己优化pandas读取大文件效率的探索过程。

1.准备部分

首先,准备数据。

下面的测试用的数据是一些虚拟币的交易数据,除了常用的K线数据之外,还包含很多分析因子的值。

importpandasaspd

fp=all_coin_factor_data_12H.csv

df=pd.read_csv(fp,encoding=gbk)

df.shape

#运行结果

(398070,224)

总数据量接近40万,每条数据有224个属性。

然后,封装一个简单的装饰器来计时函数运行时间。

fromtimeimporttime

deftimeit(func):

deffunc_wrapper(*args,**kwargs):

start=time()

ret=func(*args,**kwargs)

end=time()

spend=end-start

print({}costtime:{:.3f}s.format(func.__name__,spend))

returnret

returnfunc_wrapper

2.正常读取

先看看读取这样规模的数据,需要多少时间。

下面的示例中,循环读取10次上面准备的数据all_coin_factor_data_12H.csv。

importpandasaspd

@timeit

defread(fp):

df=pd.read_csv(

encoding=gbk,

parse_dates=[time],

returndf

if__name__==__mAIn__:

fp=./all_coin_factor_data_12H.csv

foriinrange(10):

read(fp)

运行结果如下:

读取一次大概27秒左右。

3.压缩读取

读取的文件all_coin_factor_data_12H.csv大概1.5GB左右,

pandas是可以直接读取压缩文件的,尝试压缩之后读取性能是否能够提高。

压缩之后,大约615MB左右,压缩前大小的一半不到点。

importpandasaspd

@timeit

defread_zip(fp):

df=pd.read_csv(

encoding=gbk,

parse_dates=[time],

compression=zip,

returndf

if__name__==__main__:

fp=./all_coin_factor_data_12H.zip

foriinrange(10):

read_zip(fp)

运行结果如下:

读取一次大概34秒左右,还不如直接读取来得快。

4.分批读取

接下来试试分批读取能不能提高速度,分批读取的方式是针对数据量特别大的情况,

单机处理过亿数据量的时候,经常会用到这个方法,防止内存溢出。

先试试每次读取1万条:

importpandasaspd

@timeit

defread_chunk(fp,chunksize=1000):

df=pd.DataFrame()

reader=pd.read_csv(

encoding=gbk,

parse_dates=[time],

chunksize=chunksize,

forchunkinreader:

df=pd.concat([df,chunk])

df=df.reset_index()

returndf

if__name__==__main__:

fp=.

文档评论(0)

152****2468 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档