【问题标题】:Size of memory allocated to a SQLite in-memory database分配给 SQLite 内存数据库的内存大小
【发布时间】:2012-06-16 06:26:34
【问题描述】:

如果使用以下语法创建内存中的 sqlite 数据库,那么分配给它的最大内存大小是多少?

my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');

如果内存数据库的大小变得大于最大可用内存会发生什么。

假设我有 1 GB 的空闲空间,而数据库大小变为 1.1 GB,那么将一些数据写入磁盘还是什么?

有没有办法改变分配给内存中 sqlite 数据库的 max-memory 的值?

【问题讨论】:

    标签: database sqlite size in-memory


    【解决方案1】:

    它将使用虚拟内存,是的,一旦您超过了所有可用内存,它就会写入磁盘,当超过时,它可能会抛出异常,具有未定义的行为,或者它可能取决于操作系统。 这些是 SQLite 限制:http://www.sqlite.org/limits.html

    如果要设置最大数据库大小,可以执行以下 SQL 命令:

    PRAGMA page_size = 512
    PRAGMA max_page_count = 195313
    

    在 Perl 中:

    $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
    $query_handle = $dbh->prepare("PRAGMA page_size = 512");
    $query_handle->execute();
    $query_handle = $dbh->prepare("PRAGMA max_page_count = 195313");
    $query_handle->execute();
    

    您可以通过创建一个临时表并使用循环插入大量对象来对其进行测试,直到达到限制为止。

    这会将您的最大数据库大小设置为 100,000,256 字节。

    SQlite 数据库存储在页面中,这将为您的数据库设置页面大小和最大页面数。您可以使用任一参数来满足您的需求;更大的页面意味着更高的性能,但更快的增长。

    这些是 sqlite 支持的所有 PRAGMAS:http://www.sqlite.org/pragma.html#pragma_page_size

    这是一个简单的 Python 测试:

    import sqlite3
    
    con = sqlite3.connect(':memory:')
    cur = con.cursor() 
    cur.execute("PRAGMA max_page_count = 195313")
    cur.execute("PRAGMA page_size = 512")
    cur.execute("CREATE TABLE test (random_values TEXT)")
    index = 0
    query = "INSERT INTO test (random_values) VALUES ('%s')" % "".join(['a' for index in xrange(1000)])
    while True:
        try:
            c = cur.execute(query)
            index += 1
        except Exception as ex:
            print str(ex)  
            break       
    
    print index * 1000
    

    很快你就会得到这样的东西:

    sqlite3.OperationalError: 数据库或磁盘已满

    由于开销,我得到了 93915000 字节,所以如果您想要 100 兆字节,请使用这些设置。

    【讨论】:

    • 有没有办法为内存数据库定义最大大小?我想将其限制为 100 MB。 100 MB 后,它应该返回 SQLITE_FULL,如文档中所述。
    • @Saumitra 经过一番谷歌搜索后,我发现了,希望对您有所帮助。
    • 是的,这肯定会有所帮助...感谢您花时间回答这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多