【问题标题】:sqlite memory usage issue for db file size > 2GB when creating index创建索引时 db 文件大小 > 2GB 的 sqlite 内存使用问题
【发布时间】:2023-03-29 06:40:02
【问题描述】:

我有一个带有两个表的简单 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 时,我会看到内存错误。

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

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

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

【问题讨论】:

  • 您是在 Python 中嵌入的 SQLite 版本中创建索引,还是使用sqlite3 命令行工具创建索引?这是哪个 SQLite 版本?你能用the latest version试试吗?
  • CL,我使用 3.7.14.1 2012-10-4 版本的 sqlite 代码。 sqlite 模块嵌入在 python 中。 SQL 命令是通过 Python 输入的。在输入所有数据后发出“创建索引”命令之前,内存使用情况很好。我会尝试最新版本。您是否尝试过创建具有多 GB 大小文件/数百万/亿行的索引?你有内存问题吗?

标签: python linux sqlite


【解决方案1】:

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

确保/tmp 上有足够的可用空间,或将TMPDIR 移至别处。

【讨论】:

  • 感谢您的建议。我尝试升级到最新的 3.8.x,但仍然没有帮助。系统在创建索引时仍然遇到内存不足的错误。创建索引的表中有 200+ 百万行。
【解决方案2】:

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

pragma temp_store = memory;

但显然有多少可用内存是有限制的。我修复了它使用

pragma temp_store = file;

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

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

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    相关资源
    最近更新 更多