4

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

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

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

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

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

4

1 回答 1

7

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

于 2012-06-16T06:39:10.187 回答