You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效压缩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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:14:50