分配给SQLite内存数据库的内存大小

时间:2012-06-16 06:26:34

标签: database sqlite size in-memory

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

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

如果内存数据库的大小超过最大可用内存,会发生什么。

假设我有1 GB可用空间且数据库大小变为1.1 GB,那么是否会将某些数据写入磁盘或者是什么?

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

1 个答案:

答案 0 :(得分:4)

它将使用虚拟内存,是的,一旦超出所有可用内存,它就会写入磁盘,当超出所有内存时,它可能会抛出异常,具有未定义的行为,或者它可能依赖于操作系统。 这些是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兆字节,请使用设置。