内存大小分配给一个SQLite内存数据库(Size of memory allocated to a

2019-07-29 23:39发布

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

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

如果内存数据库的大小比最大可用内存更大会发生什么。

假设我有1 GB的免费数据库大小成为1.1 GB,然后将一些数据写入到磁盘还是什么?

有没有办法来改变分配给内存SQLite数据库最大内存的值?

Answer 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();

您可以通过创建临时表,并使用循环插入大量的对象进行测试,直到它击中了极限。

这将设置你的最大数据库大小100000256个字节。

SQLite数据库存储在页,这将设置页面大小和为您的数据库页面的最大数量。 你可以用任一参数发挥,以满足您的需求; 更大的页面意味着更多的性能,但增长较快。

这些都是说SQLite支持编译指示: 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兆字节与设置玩。



文章来源: Size of memory allocated to a SQLite in-memory database