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

如何高效将大量pickle格式numpy数组合并为单个CSV文件

嘿,我明白你现在的痛点——几千个pickle文件一个个处理,还得转成CSV的每一行,之前用迭代构造字符串再追加的方法效率低到让人抓狂对吧?别担心,我给你几个针对性的高效解决方案,保证能大幅提升处理速度!

核心优化思路

之前的方法慢主要有两个原因:一是Python层面的字符串拼接属于**O(n²)**的低效操作,二是频繁打开/关闭文件或者逐行追加带来的IO开销。我们要做的就是用numpy的底层优化来替代Python循环,同时减少IO操作的次数。

方法一:单进程高效逐行写入

这个方法适合内存不算特别充裕的场景,核心是用numpy的内置函数处理数组到CSV行的转换,同时全程保持输出文件打开状态,避免重复IO操作。

import numpy as np
import os

# 配置路径
folder_path = "your_folder_path"  # 替换成你的pickle文件夹路径
output_csv = "merged.csv"

# 获取排序后的文件列表(保证0.pkl、1.pkl...的顺序)
file_list = sorted(
    [f for f in os.listdir(folder_path) if f.endswith(".pkl")],
    key=lambda x: int(x.split(".")[0])
)

# 一次性打开输出文件,逐行写入
with open(output_csv, "w") as f_out:
    for file_name in file_list:
        file_path = os.path.join(folder_path, file_name)
        # 加载pickle中的numpy数组
        arr = np.load(file_path, allow_pickle=True)
        # 用numpy的savetxt直接写入一行(底层C实现,比Python拼接快很多)
        np.savetxt(f_out, arr.reshape(1, -1), fmt="%d", delimiter=",", newline="\n")

为什么这个方法快?

  • numpy底层优化:np.savetxt是用C语言实现的,比手动在Python里循环拼接字符串效率高几十倍
  • 减少IO操作:全程只打开一次输出文件,避免了反复打开/关闭文件的开销
  • 排序保证顺序:通过文件名提取数字排序,确保CSV行的顺序和pickle文件编号一致

方法二:多进程并行加速(适合多核CPU)

如果你的机器有多个CPU核心,可以用并行处理进一步提升速度——毕竟每个pickle文件的加载和转换都是独立的任务。

import numpy as np
import os
from multiprocessing import Pool, Lock

# 全局锁,保证文件写入不会冲突
write_lock = Lock()
folder_path = "your_folder_path"
output_csv = "merged.csv"

def process_single_file(file_name):
    file_path = os.path.join(folder_path, file_name)
    # 加载数组
    arr = np.load(file_path, allow_pickle=True)
    # 转换为CSV行字符串
    line = ",".join(arr.astype(str)) + "\n"
    # 加锁写入,避免多个进程同时写文件导致内容混乱
    with write_lock:
        with open(output_csv, "a") as f_out:
            f_out.write(line)

if __name__ == "__main__":
    # 先清空输出文件(避免之前的残留内容)
    open(output_csv, "w").close()
    # 获取排序后的文件列表
    file_list = sorted(
        [f for f in os.listdir(folder_path) if f.endswith(".pkl")],
        key=lambda x: int(x.split(".")[0])
    )
    # 启动进程池(根据你的CPU核心数调整,比如4核就设4)
    with Pool(processes=4) as pool:
        pool.map(process_single_file, file_list)

注意事项

  • 如果你的内存足够大,也可以先把所有数组加载到内存再一次性写入,但5000个92万元素的数组大概占17GB内存,大部分机器可能吃不消,所以逐行并行写入更稳妥
  • 进程数不要超过你的CPU核心数,否则反而会因为进程切换导致效率下降

额外优化小技巧

  • 如果你的pickle文件是用np.save保存的(而不是Python的pickle模块),可以用np.load(file_path, allow_pickle=False),速度会更快(因为不需要处理pickle的通用序列化)
  • 如果磁盘IO是瓶颈,可以考虑把pickle文件放到SSD上处理,读写速度会比HDD快很多

内容的提问来源于stack exchange,提问作者Cryptic Pug

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:35:15