4

以下の構文を使用してインメモリsqliteデータベースを作成する場合、それに割り当てられる最大メモリのサイズはどれくらいですか?

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

インメモリデータベースのサイズが使用可能な最大メモリより大きくなるとどうなりますか。

1 GBの空き容量があり、データベースのサイズが1.1 GBになったとすると、一部のデータはディスクに書き込まれますか?

インメモリsqliteデータベースに割り当てられたmax-memoryの値を変更する方法はありますか?

4

1 に答える 1

7

仮想メモリを使用します。自由に使用できるすべてのメモリを超えると、ディスクに書き込みます。それを超えると、例外がスローされるか、未定義の動作が発生するか、OSに依存する可能性があります。これらは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がサポートするすべてのプラグマです: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 に答える