正如问题所说,我正在尝试将一个大矩阵保存到 Julia 中的 SQLite 数据库中。该矩阵有 500 行和 1000 列。
当我尝试保存矩阵时,它挂起并且未完成。然而,我意识到我可以轻松保存尺寸为 50000X10 的矩阵,该矩阵具有相同数量的单元格。
我可以只保存相关的笛卡尔指数,但我宁愿保存一个矩阵。
这里有一些示例代码,说明了拥有额外列的速度有多慢:
#test sql set
using SQLite
using DataFrames
using Tables
db1 = SQLite.DB()#to memory
@time SQLite.load!(Tables.table(zeros(5000, 10)), db1)
@time SQLite.load!(Tables.table(zeros(500, 100)), db1)
输出:
1.237796 seconds (2.10 M allocations: 128.612 MiB, 3.90% gc time, 97.92% compilation time)
6.039620 seconds (1.29 M allocations: 80.599 MiB, 0.25% gc time, 99.86% compilation time)
我们可以看到 5000x10 和 500x100 之间的区别是后者的速度大约慢 5 倍。
谢谢您的帮助。
区别在于编译时间。尝试两次以跳过编译:
@time SQLite.load!(Tables.table(zeros(5000, 10)), db1)
@time SQLite.load!(Tables.table(zeros(500, 100)), db1)
@time SQLite.load!(Tables.table(zeros(5000, 10)), db1)
@time SQLite.load!(Tables.table(zeros(500, 100)), db1)
打印
0.524541 seconds (2.09 M allocations: 128.564 MiB, 6.16% gc time, 99.20% compilation time)
2.375439 seconds (1.29 M allocations: 80.602 MiB, 0.29% gc time, 99.85% compilation time)
0.003520 seconds (179.79 k allocations: 3.594 MiB)
0.002945 seconds (154.17 k allocations: 2.857 MiB)
注意,使用 BenchmarkTools.jl 的 @btime 对于 timimg 来说更好,因为它首先编译并执行多次运行的平均值。
我不知道为什么一个编译速度更快,但怀疑一个在某个编译循环中执行某件事 100 次,另一个执行 10 次。