2012-06-16 100 views
2

如果使用下面的語法創建內存中的sqlite數據庫,那麼分配給它的最大內存大小是多少?分配給SQLite內存數據庫的內存大小

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

如果內存數據庫的大小變得大於最大可用內存,會發生什麼情況。

假設我有1 GB的空閒空間,數據庫大小變爲1.1 GB,那麼將一些數據寫入磁盤或什麼?

有沒有辦法改變分配給內存中sqlite數據庫的最大內存的值?

回答

3

它會使用虛擬內存,是的,一旦超過了所有可用內存,當它超出時,它可能會拋出異常,具有未定義的行爲,或者可能取決於操作系統。 這些是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: database or disk is full

我得到93915000字節由於開銷,所以與設置玩如果你想要100兆字節。

+0

是否有一種方法可以定義內存數據庫的最大大小?我想限制它說100 MB。在100 MB之後,它應該返回文檔中提到的SQLITE_FULL。 – AnonGeek

+0

@Saumitra一些谷歌搜索後,我發現,我希望它有幫助。 –

+0

是的,它肯定會有幫助...感謝很多給這個問題的時間。 – AnonGeek