我有一个带有两个表的简单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?
答案 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;