sqlite3 的硬盘数据库如何转换成内存模式?

2017-02-19 15:57:08 +08:00
 omg21

刚开始学习 sqlite3 ,请问一下,如果是数据库保存在硬盘上,那么能不能转换成内存模式再操作? 主要是用于查询这块,我保存了电话区号,省市名称等内容,想一次性转换成内存模式,调用起来快些。

9485 次点击
所在节点    Python
20 条回复
swuzjb
2017-02-19 16:29:07 +08:00
提前读出来?
wohenyingyu02
2017-02-19 16:29:08 +08:00
omg21
2017-02-19 16:33:25 +08:00
@swuzjb 读出来再导入到内存数据库中?太麻烦了吧,能不能用一两条语句转换的?
swuzjb
2017-02-19 16:42:19 +08:00
@omg21 弱鸡表示不知道啥叫内存数据库。。。。。
ioiogoo
2017-02-19 22:07:40 +08:00
直接上 redis 呗
suduo1987
2017-02-19 22:32:15 +08:00
单例,延时加载,条件预加载
xieranmaya
2017-02-19 23:34:05 +08:00
https://stackoverflow.com/questions/3850022/how-to-load-existing-db-file-to-memory-in-python-sqlite3
大致思路是先备份然后恢复到内存数据库中
我就在想有没有什么能直接操作内存的方法,比如直接把文件读了放在内存里,然后告诉 sqlite3 内存位置,估计读源码肯定可以,就找处理:memory:那段代码修改
pppguest3962
2017-02-20 00:29:53 +08:00
小码民路过。。。前几年用 C++ & cppsqlite3 做背单词的小软件,把金山词霸词库 XML 的格式( 23 万单词加例句,词性,解释,音标什么的几乎一字不漏弄进去了,数据库也就单文件 26M 上下),查个单词加组织起来的界面显示都是很快的,所以当时略了解过 sqlite3 的皮毛,似乎在理解的印象+文档中, sqlite 检索决定性并不在于 I/O (当然 I/O 也很重要),而在于分库+索引+算法,当时在论坛上有老外做了一秒 2,3 百万的压力也是妥妥的,当时也有想过楼主的问题,没研究下去了,觉得没必要。因为在内存里操作,就直接等于写字节了,而不在于对数据库的操作了,总不能为了喝牛奶而去研究牛的养殖方式吧,如果楼主研究成功了,麻烦烧纸告知,谢谢!
pppguest3962
2017-02-20 00:33:11 +08:00
漏写了一句,楼主研究学习还是很支持的~
jininij
2017-02-20 00:54:40 +08:00
同步到 /dev/shm 中 ?( 逃
Tyanboot
2017-02-20 01:27:04 +08:00
…我当初是把 SQLite3 数据库放在了内存盘中…
结果 insert 速度提升了似乎有几十倍。。。。

原本要插好几分钟的数据,只花了十秒左右。。。
likuku
2017-02-20 01:59:16 +08:00
linux 下,用 tmpfs 保存数据库文件副本
omg21
2017-02-20 09:38:26 +08:00
@pppguest3962 其实我现在已经实现了,在运行时新建一个内存数据库,把硬盘数据库内的记录一条条导入到内存数据库中,但我觉得这种方法比较 LOW ,是吧,所以想看看有没有更为简便的方法能用一两条语句就直接转换了的。
ijustdo
2017-02-20 12:57:38 +08:00
python sqlite3 的 connect 有个 iterdump()
具体的自己看手册去 嘿嘿 就不告诉你

得到太容易 容易忘记 ^_^
cnZary
2017-02-20 13:46:16 +08:00
ramdisk (匿了
omg21
2017-02-20 14:48:25 +08:00
@ijustdo

关于 iterdump() 我只找到这一个,并没找到相关文档,这个实例是从内存库里导到文件库的,但我的需要是相反的啊,我想从文件库里导到内存中。
buffer = StringIO.StringIO()
>>for line in db.iterdump():
>>>>buffer.write(line)
>>db.close()
ilcn
2017-02-21 05:00:50 +08:00
推荐一个神库 sqlitedict ,用过之后保准上瘾。题主闲存进内存麻烦的话,用这个就是一两行代码的问题。
omg21
2017-02-21 09:25:13 +08:00
@ilcn 刚粗略看了下,是挺好的,待细究,谢谢
ijustdo
2017-02-21 11:51:40 +08:00
你先对 文件库里的 iterdump
然后再建一个内存库 内存库导入这个 dump 不就完了

两个 sqlite db a 是磁盘 b 内存
a dump 后
b 导入 a 的 dump

然后进程结束钱 b dump 然后 a 导入 b 的 dump

脑子咋不灵活点呢
phikaa
2018-06-08 16:41:31 +08:00
我滴天啊~
19 个回复,竟然没有一个是对的.
rc = sqlite3_open(":memory:", &db);
https://www.sqlite.org/inmemorydb.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/341566

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX