db文件大小的sqlite内存使用问题>创建索引时为2GB

时间:2013-08-23 18:38:53

标签: python linux sqlite

我有一个带有两个表的简单sqlite数据库。

Table 1:
    Col1: int index; 
    Col2: text; 
    Col3: int;
Table 2:
    Col1: int; 
    Col2: int;  
    Col3: int;

第一个表达到数百万行。表2可以有数亿行。表1,Col2在输入所有数据后被索引。还为表2 col1,col2创建了索引。

当数据库文件大小很小时,索引创建工作正常 - < 3.5GB。当数据库文件系统是> 3.5GB,我会看到内存错误。

这是Linux系统,在32位内核上,文件大小> 2GB似乎在索引创建期间导致内存错误。在64位内核上,限制是> 3.5GB。

从“顶级”程序,我看到在死机之前,VM和RSS使用率在64位系统上高达3.5GB。

有没有人见过这个?有关如何解决此问题的任何建议。有没有人有幸使用多GB文件大小+索引创建的sqlite?

2 个答案:

答案 0 :(得分:1)

使用较新的SQLite版本以避免占用内存。 (3.7.16对我有用。)

确保/tmp上有足够的可用空间,或将TMPDIR移到其他地方。

答案 1 :(得分:1)

我遇到了同样的问题,发现它是由temp_store pragma引起的。我将其设置为

pragma temp_store = memory;

,但显然有多少可用内存是有限的。我用

pragma temp_store = file;

如果您知道特定的索引会导致类似这样的问题,那么您可以在“创建”语句周围设置编译指示,然后再进行更改:

pragma temp_store = file;
create index if not exists table_1_index on table_1(Col1);
pragma temp_store = memory;