如果使用下面的语法创建内存中的sqlite数据库,那么分配给它的最大内存大小是多少?
my $dbh = DBI->connect('dbi:SQLite:dbname=:memory:');
如果内存数据库的大小超过最大可用内存,会发生什么。
假设我有1 GB可用空间且数据库大小变为1.1 GB,那么是否会将某些数据写入磁盘或者是什么?
有没有办法改变分配给内存中sqlite数据库的max-memory的值?
答案 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兆字节,请使用设置。