datatable追加合并多CSV是否比pandas DataFrame更快及最优方案咨询
问题解答
问题1:改用datatable实现合并的速度表现
答案是肯定的,速度会比你现在用的pandas方案快很多。
首先datatable的CSV读写是原生C级优化,读CSV速度普遍是pandas的310倍,写CSV速度也比pandas`pd.to_csv`快25倍,单文件读写的基础性能优势已经很明显。其次你现在用的pandas逐文件追加方案本身有额外开销:pandas的append/concat操作每次都会生成新的DataFrame副本,数据量越大,重复内存拷贝的损耗越高,而datatable的行绑定rbind操作是原生优化的,追加时的内存拷贝开销极低,合并环节的效率提升会比单纯读写的提升更突出。如果是处理总大小10GB以上的多CSV合并,这个方案的整体耗时大概率能降到你原有pandas方案的1/3甚至更低。
问题2:非pandas的最快CSV合并实现方式
可以根据你的使用场景选对应方案,性能从高到低排序如下:
- 无校验纯合并场景(最快):如果所有CSV的表头完全一致,不需要做数据类型校验、格式转换、内容清洗,最快的方式是直接用系统级文件拼接命令,完全不需要加载数据到内存,耗时只和文件总大小有关,比任何Python库的实现都快10倍以上。
示例命令:- Linux/macOS:
cat *.csv | awk 'NR==1 || !/^你的表头内容正则/' > merged.csv,其中awk逻辑是用来去重多个文件的重复表头 - Windows:
copy /b *.csv merged.csv,执行后手动删掉文件中多余的表头行即可
- Linux/macOS:
- 需要同步做数据处理场景:就是你提到的datatable方案,如果需要在读入时做字段筛选、类型转换、简单清洗,datatable是最优选择,参考实现代码:
import datatable as dt from pathlib import Path # 读取目标目录下所有CSV csv_path_list = list(Path("./目标csv目录").glob("*.csv")) merged_dt = dt.Frame() for csv_p in csv_path_list: temp_dt = dt.fread(csv_p) merged_dt = dt.rbind(merged_dt, temp_dt) # 输出合并结果 merged_dt.to_csv("merged_result.csv") - 需要复杂数据处理场景:可以选polars库,它的CSV读写、合并性能和datatable接近,API设计更贴近pandas,上手成本更低,性能也远高于pandas。
内容的提问来源于stack exchange,提问作者MCPMH
相关产品推荐
相关产品推荐

