如何在 Julia 中将多列矩阵保存到 SQLite 数据库

问题描述 投票:0回答:1

正如问题所说,我正在尝试将一个大矩阵保存到 Julia 中的 SQLite 数据库中。该矩阵有 500 行和 1000 列。

当我尝试保存矩阵时,它挂起并且未完成。然而,我意识到我可以轻松保存尺寸为 50000X10 的矩阵,该矩阵具有相同数量的单元格。

  1. 有没有办法更优化地将具有多列的矩阵保存到 SQLite 数据库中?

我可以只保存相关的笛卡尔指数,但我宁愿保存一个矩阵。

  1. 为什么列数对运行时间的影响比行数大得多?这与 SQLite 的工作方式有关系吗?

这里有一些示例代码,说明了拥有额外列的速度有多慢:

#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 倍。

谢谢您的帮助。

sqlite matrix julia
1个回答
0
投票

区别在于编译时间。尝试两次以跳过编译:

@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 次。

© www.soinside.com 2019 - 2024. All rights reserved.