如何高效压缩1GB大体积CSV采样数据?求优化处理方案
高效处理大CSV的降采样与行范围截取问题
你的现有代码效率低主要有两个原因:一是chunksize=2的小批量循环带来大量IO和计算开销,二是手动用csv.writer逐行写入的效率太差。针对你的需求,这里有几个更高效的实现思路:
核心优化方案:批量读取+向量化分组计算
先明确你需要处理的行范围:
- 6分钟对应行号:
6*60*10000 = 3600000(跳过前3600000行,从第3600001行开始) - 13分钟对应行号:
13*60*10000 = 7800000,所以需要读取的总行数是7800000 - 3600000 = 4200000行
直接用pandas批量读取目标范围,然后用向量化操作完成每两行取均值的降采样,最后一次性写入文件:
import pandas as pd csv_filename = 'my_path' header = ['title1', 'title2'] # 读取6:00到13:00的目标数据块 df = pd.read_csv( csv_filename, header=None, skiprows=3600000, # 跳过前6分钟的3600000行 nrows=4200000, # 读取接下来的7分钟(420万行)数据 names=header ) # 每两行分组取均值:用整数索引整除2作为分组键 df_compressed = df.groupby(df.index // 2)['title2'].mean().reset_index() # 生成时间列(每步对应0.2ms,即5kHz采样间隔) df_compressed['time[s]'] = df_compressed['index'] * 0.0002 # 1/5000 = 0.0002s df_compressed.rename(columns={'title2': 'Displacement[um]'}, inplace=True) # 写入压缩后的文件,只保留需要的列 df_compressed[['time[s]', 'Displacement[um]']].to_csv('compressed.csv', index=False)
为什么这个方法更快?
- 批量IO:一次性读取目标行范围,避免了小chunk循环的频繁文件读写开销
- 向量化计算:
groupby+mean是pandas底层优化的向量化操作,比Python循环快几个数量级 - 高效写入:用
to_csv批量写入,比手动逐行调用csv.writer减少了大量IO操作
进阶优化(如果未来文件更大)
如果以后遇到超过内存的超大文件,可以用Dask来并行处理,它的API和pandas兼容,能自动分块处理而不占满内存:
import dask.dataframe as dd dask_df = dd.read_csv( csv_filename, header=None, skiprows=3600000, nrows=4200000, names=header ) # 同样的分组逻辑,Dask会自动并行处理 compressed_dask = dask_df.groupby(dask_df.index // 2)['title2'].mean().reset_index() compressed_dask = compressed_dask.assign(time_s=compressed_dask.index * 0.0002) compressed_dask = compressed_dask.rename(columns={'title2': 'Displacement[um]', 'time_s': 'time[s]'}) # 写入文件 compressed_dask[['time[s]', 'Displacement[um]']].to_csv('compressed_dask.csv', index=False, single_file=True)
内容的提问来源于stack exchange,提问作者Matheus Schultz
相关产品推荐
相关产品推荐

