2

我有一个带有两个表的简单 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。

从“顶级”程序中,我看到 64 位系统上的 VM 和 RSS 使用量在它死之前上升到 3.5GB。

有人见过这个吗?有关如何解决此问题的任何建议。有人对具有多 GB 文件大小 + 索引创建的 sqlite 感到幸运吗?

4

2 回答 2

1

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

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

于 2013-08-23T22:00:13.880 回答
1

我有同样的问题,发现它是由temp_store pragma引起的。我把它设置为

pragma temp_store = memory;

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

pragma temp_store = file;

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

pragma temp_store = file;
create index if not exists table_1_index on table_1(Col1);
pragma temp_store = memory;
于 2020-04-15T15:20:17.553 回答