代码之家  ›  专栏  ›  技术社区  ›  Adam Matan

如何在python sqlite3中将现有的db文件加载到内存中?

  •  55
  • Adam Matan  · 技术社区  · 14 年前

    我有一个现有的 sqlite3 数据库文件,在这个文件上我需要做一些广泛的计算。从文件中进行计算是非常缓慢的,因为文件不是很大(~ 10 MB ,所以将它加载到内存中应该没有问题。

    是否有一种方法可以将现有文件加载到内存中以加快计算速度?

    8 回复  |  直到 6 年前
        1
  •  103
  •   Cenk Alti    13 年前

    以下是我为我的烧瓶应用程序编写的片段:

    import sqlite3
    from StringIO import StringIO
    
    def init_sqlite_db(app):
        # Read database to tempfile
        con = sqlite3.connect(app.config['SQLITE_DATABASE'])
        tempfile = StringIO()
        for line in con.iterdump():
            tempfile.write('%s\n' % line)
        con.close()
        tempfile.seek(0)
    
        # Create a database in memory and import from tempfile
        app.sqlite = sqlite3.connect(":memory:")
        app.sqlite.cursor().executescript(tempfile.read())
        app.sqlite.commit()
        app.sqlite.row_factory = sqlite3.Row
    
        2
  •  16
  •   MasterScrat    11 年前

    sqlite3.Connection.iterdump “[r]返回迭代器以SQL文本格式转储数据库。在保存内存中的数据库以便以后恢复时很有用。此功能提供与 .dump sqlite3 shell中的命令。“

    得到这样一个迭代器,将基于磁盘的数据库转储到基于内存的数据库中,就可以开始计算了。当计算完成后,只需将另一个方法转储回磁盘。

        3
  •  8
  •   Jouni K. Seppänen    14 年前

    首先,你应该试着找出是什么导致了你观察到的缓慢。你在给桌子写信吗?你的文章足够大吗 transactions 这样就不会把不必要的临时结果保存到磁盘上了?您能将写入更改为转到临时表吗(使用 pragma temp_store=memory )?你能和我一起生活吗 pragma synchronous=off ?

    我不认为这个功能在python模块中公开,但是sqlite有一个 backup API 这听起来正是您所要求的:一种从一个数据库复制到另一个数据库(其中一个数据库可能是内存中的数据库)的方法,它几乎可以自动工作,而无需任何用户可见的表枚举。(也许 APSW 暴露了这一点?)

    另一个选项是创建一个RAM磁盘(如果您对环境有足够的控制),并将文件复制到那里。

        4
  •  5
  •   obgnaw    7 年前

    如果我们必须使用Python包装器,那么没有比这两个传递读写解决方案更好的解决方案了。 但从3.7.17版开始,sqlite可以选择直接使用内存映射的I/O访问磁盘内容。 sqlite mmap

    如果要使用mmap,则必须使用C接口,因为没有包装器提供它。

    还有另一个硬件解决方案,内存磁盘,这样您就有了方便的文件IO和内存速度。

        5
  •  4
  •   Community CDub    8 年前

    之前已经回答过这个问题,包括以下代码示例: In python, how can I load a sqlite db completely to memory before connecting to it?

    您没有提到操作系统,但WindowsXP的一个优点是它默认为10MB文件缓存,不管您有多少内存。(这在64MB等系统出现的时候是有道理的)。此邮件有多个链接:

    http://marc.info/?l=sqlite-users&m=116743785223905&w=2

        6
  •  4
  •   DuÅ¡an Maďar    8 年前

    这是一种将SQLite数据库读取到内存中的相对简单的方法。根据您对操作数据的偏好,可以使用PANDAS数据框,也可以将表写入内存中的sqlite3数据库。同样,在操作数据之后,您使用相同的df.to-sqlite方法将结果存储回DB表中。

    import sqlite3 as lite
    from pandas.io.sql import read_sql
    from sqlalchemy import create_engine
    
    engine = create_engine('sqlite://')
    c = engine.connect()
    conmem = c.connection
    con = lite.connect('ait.sqlite', isolation_level=None) #Here is the connection to <ait.sqlite> residing on disk
    cur = con.cursor()
    sqlx = 'SELECT * FROM Table'
    df = read_sql(sqlx, con, coerce_float=True, params=None) 
    
    #Read SQLite table into a panda dataframe
    df.to_sql(con=conmem, name='Table', if_exists='replace', flavor='sqlite')
    
        7
  •  2
  •   thinwybk    6 年前

    怎么样 sqlite3.Connection.backup(...) “这种方法可以备份一个sqlite数据库,即使它被其他客户端访问,或者同时被同一个连接访问。“可用性:sqlite 3.6.11或更高版本。3.7版新增。

    import sqlite3
    
    source = sqlite3.connect('existing_db.db')
    dest = sqlite3.connect(':memory:')
    source.backup(dest)
    
        8
  •  0
  •   jedi_coder    14 年前

    sqlite支持内存数据库。

    在python中,您将使用 记忆: 数据库名称。

    也许您可以打开两个数据库(一个来自文件,一个在内存中为空),将文件数据库中的所有内容迁移到内存中,然后进一步使用内存中的数据库进行计算。

    推荐文章