Julia 1.9+高效读取Pickle或CSV文件的最优方法
高效读取Pickle/CSV文件的Julia方案
一、优化Pickle读取速度
1. 直接调用Python的pandas读取(推荐)
Julia的Pandas.jl包在类型转换环节可能存在额外开销,改用PythonCall.jl直接调用Python原生的pandas.read_pickle,速度会和Python原生表现接近:
using PythonCall pd = pyimport("pandas") fn = "./data/second_example.pickle" @time data = pd.read_pickle(fn);
这种方式跳过了Julia-Pandas包的中间适配层,直接复用Python的高效实现,能大幅压缩读取耗时。
2. 升级或切换Pickle解析库
- 尝试使用最新版的
Pickle.jl,该库对高版本Pickle格式(v4+)做了针对性性能优化:
using Pickle fn = "./data/second_example.pickle" @time data = load(fn);
- 确认Pickle文件的版本:如果是Python 2的旧格式,先在Python中重新保存为Python 3的Pickle格式(
pickle.dump(..., protocol=4)),新格式在Julia中解析效率更高。
二、转CSV后用Julia原生库读取(更稳定高效)
如果可以提前转换文件格式,Julia的CSV.jl是目前速度最快的CSV读取工具之一,非常适合批量处理场景:
1. 批量转Pickle为CSV(Python端处理)
利用Python读取Pickle快的优势,写个脚本批量转换文件:
import pandas as pd import os input_dir = "./data" output_dir = "./data_csv" os.makedirs(output_dir, exist_ok=True) for filename in os.listdir(input_dir): if filename.endswith(".pickle"): file_path = os.path.join(input_dir, filename) df = pd.read_pickle(file_path) csv_filename = os.path.splitext(filename)[0] + ".csv" df.to_csv(os.path.join(output_dir, csv_filename), index=False)
2. Julia端高效读取CSV
用CSV.jl配合DataFrames.jl读取,开启多线程并指定列类型进一步加速:
using CSV, DataFrames fn = "./data_csv/second_example.csv" # 根据你的数据结构指定列类型,减少类型推断开销 col_types = Dict("col1" => Int64, "col2" => Float64) @time df = CSV.read(fn, DataFrame; types=col_types, threaded=true);
threaded=true会利用多核CPU加速读取,指定types参数可以避免Julia自动推断类型的耗时,同时减少不必要的内存分配。
三、通用性能优化技巧
- 临时关闭垃圾回收:读取大文件前执行
GC.enable(false),读取完成后再GC.enable(true),避免读取过程中触发GC拖慢速度。
内容的提问来源于stack exchange,提问作者Blas Kolic
相关产品推荐
相关产品推荐

