- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)