Pandas读取列数可变文本文件时skiprows增大耗时增加的优化问询
处理可变列宽空格分隔文本的性能优化
我需要处理一个包含175132行、列数可变的空格分隔中型文本文件,目标是读取文件的不同部分并转换为数组,用于后续数据处理。
初始方案及性能问题
最初我使用自定义函数循环调用pd.read_csv,通过skiprows指定跳过行数来读取单行数据,代码如下:
def read_table_block_to_row(file, skip, nvals, ncols): Row_values=np.zeros((1,nvals)) for row in range(int(np.ceil(nvals/ncols))): st = time.time() skiprows=skip+row row_arr=pd.read_csv(file,sep='\s+', skiprows=skiprows, nrows=1, header=None).to_numpy() for col in range(ncols): idx=row*ncols+col Row_values[0,idx]=row_arr[0,col] return (Row_values)
测试后发现严重的性能问题:skiprows的值越大,单行读取的耗时显著增加。具体测试数据如下:
skiprows=941时,耗时约0.0057秒skiprows=37421时,耗时约0.021秒skiprows=73901时,耗时约0.038秒skiprows=110381时,耗时约0.048秒
这种情况下,整体读取数据的耗时长达30-45分钟,我曾尝试查找相关解决方案但未能解决问题,因此寻求更快的块读取方案(包括非Pandas方案)。
优化方案及效果
最终我找到一种高效的优化方案:跳过文件前2行后,文件拥有足够的列宽可以直接读取全部数据,再通过自定义函数将DataFrame转换为所需格式。优化后,整体耗时从45分钟-1小时缩短至11秒。
代码实现如下:
# 跳过前2行后,文件包含了最大列数,因此可以直接读取全部数据 data = pd.read_csv(file, skiprows=2, header=None, sep='\s+') # 自定义函数读取并转换数据格式 def read_row(df,start,end): row_data = data.iloc[start:end,:].unstack().to_frame().dropna().droplevel(level=1).reset_index(drop=True).T return row_data
内容的提问来源于stack exchange,提问作者BG_rooty
相关产品推荐
相关产品推荐

