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

Ano*_*eek 2 database sqlite size in-memory

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

my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法更改分配给内存sqlite数据库的最大内存值?

Sam*_*lar 5

它会使用虚拟内存,是的,一旦超出所有可用内存,就会将其写出到磁盘中;超过该数量时,它可能会引发异常,行为不确定或与操作系统有关。这些是SQLite限制:http : //www.sqlite.org/limits.html

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

PRAGMA page_size = 512
PRAGMA max_page_count = 195313
Run Code Online (Sandbox Code Playgroud)

在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();
Run Code Online (Sandbox Code Playgroud)

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

这会将您的最大数据库大小设置为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
Run Code Online (Sandbox Code Playgroud)

很快,您会得到以下信息:

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

93915000由于开销,我得到了字节,因此,如果要精确到100兆字节,请尝试设置。