如何在Julia中读取.txt格式大型矩阵并生成Array{Float64,2}
Julia读取150k×100k超大空格分隔TXT矩阵的解决方案
150000行 × 100000列的Float64矩阵本身仅占用120GB内存(每个Float64占8字节),你的600GB设备内存完全可以放下完整矩阵,readdlm读取失败是因为它的纯文本解析逻辑会生成大量临时字符串对象,峰值内存开销远超矩阵本身的实际大小,并非总内存不足。
以下是三种可行解决方案:
- 方案1:用高性能解析库
CSV.jl直接读取(最推荐,实现简单速度快)CSV.jl是Julia生态专门优化过的表格数据解析库,内存开销极低,没有readdlm的冗余临时对象问题,代码示例:
# 首次使用先安装依赖包 using Pkg Pkg.add(["CSV", "Tables"]) # 读取代码 using CSV, Tables # 多个连续空格作为分隔符请额外加ignorerepeated=true参数 x = CSV.read("matrix_subset.txt", Tables.Matrix{Float64}, delim=' ', header=false, ignorerepeated=true)
读取完成后x的类型就是你需要的Array{Float64,2}
- 方案2:预分配矩阵+逐行读取(内存开销最小,适合边界场景)
如果CSV.jl仍然出现峰值内存溢出,可以手动预分配矩阵,逐行解析填充,全程只有矩阵本身+单行字符串的内存开销,峰值内存仅比120GB高一点:
# 提前确认你的矩阵行列数正确 const N_ROW = 150000 const N_COL = 100000 # 预分配目标矩阵 x = zeros(Float64, N_ROW, N_COL) open("matrix_subset.txt", "r") do io for i in 1:N_ROW line = readline(io) # 按空格拆分转Float64后赋值 row_vals = parse.(Float64, split(line, keepempty=false)) x[i, :] = row_vals end end
- 方案3:转二进制格式长期复用(适合需要反复读取该矩阵的场景)
如果后续还要多次使用这个矩阵,建议第一次读取完成后转存为二进制格式,下次读取速度提升10~100倍,且没有解析开销:
# 首次使用安装JLD2 using Pkg Pkg.add("JLD2") # 存为二进制文件 using JLD2 save("full_matrix.jld2", "x", x) # 后续读取仅需一行代码 x = load("full_matrix.jld2", "x")
内容的提问来源于stack exchange,提问作者ana_gg
相关产品推荐
相关产品推荐

