推荐学习书目
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 · Feb 19, 2017 · 9999 views
    This topic created in 3378 days ago, the information mentioned may be changed or developed.

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

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

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

    得到太容易 容易忘记 ^_^
    cnZary
        15
    cnZary  
       Feb 20, 2017
    ramdisk (匿了
    omg21
        16
    omg21  
    OP
       Feb 20, 2017
    @ijustdo

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

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

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

    脑子咋不灵活点呢
    phikaa
        20
    phikaa  
       Jun 8, 2018
    我滴天啊~
    19 个回复,竟然没有一个是对的.
    rc = sqlite3_open(":memory:", &db);
    https://www.sqlite.org/inmemorydb.html
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3965 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 57ms · UTC 05:11 · PVG 13:11 · LAX 22:11 · JFK 01:11
    ♥ Do have faith in what you're doing.