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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:15:03