V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
omg21
V2EX  ›  Python

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

  •  
  •   omg21 · 2017-02-19 15:57:08 +08:00 · 9507 次点击
    这是一个创建于 2863 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    20 条回复    2018-06-08 16:41:31 +08:00
    swuzjb
        1
    swuzjb  
       2017-02-19 16:29:07 +08:00
    提前读出来?
    wohenyingyu02
        2
    wohenyingyu02  
       2017-02-19 16:29:08 +08:00 via iPhone
    omg21
        3
    omg21  
    OP
       2017-02-19 16:33:25 +08:00
    @swuzjb 读出来再导入到内存数据库中?太麻烦了吧,能不能用一两条语句转换的?
    swuzjb
        4
    swuzjb  
       2017-02-19 16:42:19 +08:00
    @omg21 弱鸡表示不知道啥叫内存数据库。。。。。
    ioiogoo
        5
    ioiogoo  
       2017-02-19 22:07:40 +08:00
    直接上 redis 呗
    suduo1987
        6
    suduo1987  
       2017-02-19 22:32:15 +08:00 via iPhone
    单例,延时加载,条件预加载
    xieranmaya
        7
    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
        8
    pppguest3962  
       2017-02-20 00:29:53 +08:00
    小码民路过。。。前几年用 C++ & cppsqlite3 做背单词的小软件,把金山词霸词库 XML 的格式( 23 万单词加例句,词性,解释,音标什么的几乎一字不漏弄进去了,数据库也就单文件 26M 上下),查个单词加组织起来的界面显示都是很快的,所以当时略了解过 sqlite3 的皮毛,似乎在理解的印象+文档中, sqlite 检索决定性并不在于 I/O (当然 I/O 也很重要),而在于分库+索引+算法,当时在论坛上有老外做了一秒 2,3 百万的压力也是妥妥的,当时也有想过楼主的问题,没研究下去了,觉得没必要。因为在内存里操作,就直接等于写字节了,而不在于对数据库的操作了,总不能为了喝牛奶而去研究牛的养殖方式吧,如果楼主研究成功了,麻烦烧纸告知,谢谢!
    pppguest3962
        9
    pppguest3962  
       2017-02-20 00:33:11 +08:00
    漏写了一句,楼主研究学习还是很支持的~
    jininij
        10
    jininij  
       2017-02-20 00:54:40 +08:00 via Android
    同步到 /dev/shm 中 ?( 逃
    Tyanboot
        11
    Tyanboot  
       2017-02-20 01:27:04 +08:00 via Android
    …我当初是把 SQLite3 数据库放在了内存盘中…
    结果 insert 速度提升了似乎有几十倍。。。。

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

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

    关于 iterdump() 我只找到这一个,并没找到相关文档,这个实例是从内存库里导到文件库的,但我的需要是相反的啊,我想从文件库里导到内存中。
    buffer = StringIO.StringIO()
    >>for line in db.iterdump():
    >>>>buffer.write(line)
    >>db.close()
    ilcn
        17
    ilcn  
       2017-02-21 05:00:50 +08:00
    推荐一个神库 sqlitedict ,用过之后保准上瘾。题主闲存进内存麻烦的话,用这个就是一两行代码的问题。
    omg21
        18
    omg21  
    OP
       2017-02-21 09:25:13 +08:00
    @ilcn 刚粗略看了下,是挺好的,待细究,谢谢
    ijustdo
        19
    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
        20
    phikaa  
       2018-06-08 16:41:31 +08:00
    我滴天啊~
    19 个回复,竟然没有一个是对的.
    rc = sqlite3_open(":memory:", &db);
    https://www.sqlite.org/inmemorydb.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2350 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:53 · PVG 23:53 · LAX 07:53 · JFK 10:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.