如何用Julia快速查找两个大CSV文件交集并添加file2的额外列
优化逻辑说明
- 你原Python脚本执行慢的核心原因是时间复杂度太高:
if row1 in lst2是线性查找,每对比一行就要遍历整个file2的所有行,整体复杂度是O(M*N),大文件下耗时必然极长,不管用哪种语言都需要先优化这一点。 - 优化思路是先对file2构建哈希索引(字典),查找复杂度降到O(1),整体复杂度变成O(M+N),仅算法层面就能带来几十到上百倍的提速,搭配Julia的高性能执行效率,处理大文件的速度会远优于你现有的Python脚本。
- 附加file2额外列的逻辑:匹配成功时直接拼接file1的行与file2中对应行的多余列即可。
Julia实现代码
首先你需要先安装依赖包,在Julia REPL中执行:
using Pkg Pkg.add(["CSV", "DataFrames"])
整行匹配的实现(和你原有Python逻辑一致)
using CSV, DataFrames, Dates # 配置参数 const FILE1_PATH = "compare_input2.csv" const FILE2_PATH = "input.csv" const OUTPUT_PATH = "output.csv" const ENCODING = "ISO-8859-1" println("开始执行: ", Dates.now()) # 读取file2构建索引字典:key为file2的整行元组,value为整行内容 file2_dict = Dict{Tuple, Vector}() open(FILE2_PATH, encoding=ENCODING) do f reader = CSV.Reader(f, delim=',') for row in reader row_vec = collect(row) # 用tuple作为字典key(tuple是不可变类型可哈希) key = Tuple(row_vec) file2_dict[key] = row_vec end end println("file2索引构建完成,共$(length(file2_dict))行") # 处理file1匹配并写入输出 open(OUTPUT_PATH, "w", encoding=ENCODING) do f writer = CSV.Writer(f, delim=',', quotechar='|', quoting=CSV.QUOTE_MINIMAL) match_count = 0 total_count = 0 open(FILE1_PATH, encoding=ENCODING) do f1 reader1 = CSV.Reader(f1, delim=',') for row1 in reader1 total_count += 1 key1 = Tuple(collect(row1)) if haskey(file2_dict, key1) # 拼接file1行 + file2中比file1多的列 extra_cols = file2_dict[key1][length(row1)+1:end] output_row = vcat(collect(row1), extra_cols) write(writer, output_row) match_count += 1 end # 打印进度 if total_count % 10000 == 0 print("\r已对比$total_count行,找到$match_count个匹配") flush(stdout) end end end println("\n处理完成,共匹配到$match_count行") end println("执行结束: ", Dates.now())
指定列作为匹配键的修改方法(更常用的场景)
如果两个文件是通过指定列(比如前2列作为唯一ID)匹配,只需要修改key的构造逻辑即可,示例如下:
# 构建file2索引的代码修改为,用前两列作为匹配键 key = Tuple(row_vec[1:2]) # 查找的代码对应修改为 key1 = Tuple(collect(row1)[1:2])
内容的提问来源于stack exchange,提问作者Shesha A.V
相关产品推荐
相关产品推荐

