# Saving sparse matrix

How to save a sparse matrix in Julia? I want the saved file to be small since my Matrix size is about (2^26,2^26).
Thanks.

I would just save nonzero indexes and values as CSV:

``````using SparseArrays, DataFrames, CSV
M = sprand(10, 10, 0.2)
I, J, V = findnz(M)
df = DataFrame([:I => I, :J => J, :V => V])
CSV.write("/tmp/spmatrix.csv", df)
``````
5 Likes

Thank you, the problem is that CSV file is very large, for example in python I use *.npz which is 2-5 MB but here it can go up to 500 MB.

I don’t know this format, but you can also compress the CSV, eg with gzip.

Alternatively, you can save a bit of space by using the CSC representation (ie export directly from the fields), but I don’t think it is worth it.

1 Like

Great answer. Minor remark in passing: with `LinearAlgebra.I`, `I` is no longer a great choice in `I, J, V`. `R, C, V` or `M, N, V` are viable alternatives I’ve seen used.

For production code I would wrap it in a function so this should not matter.

1 Like

Very true!

``````using SparseArrays, DataFrames, CSV, LinearAlgebra
function save_sparse_matrix(M)
I, J, V = findnz(M)
println("I = ", I)
df = DataFrame([:I => I, :J => J, :V => V])
CSV.write("M.csv", df)
end

julia> M = sprand(10, 10, 0.2)

julia> save_sparse_matrix(M)
I = [1, 7, 5, 9, 10, 1, 3, 4, 6, 3, 4, 9, 3, 7, 10, 5, 6, 7, 9, 10, 7]

julia> I
UniformScaling{Bool}
true*I
``````

Thanks. 