⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
内存不足错误

DuckDB 拥有先进的核外查询引擎,可以将数据溢出到磁盘以处理大于内存的数据。我们不断努力改进 DuckDB,以提高其可伸缩性并尽可能防止内存不足错误。尽管如此,如果您运行包含多个阻塞操作符、某些聚合函数、PIVOT 操作等查询,或者可用内存与数据集大小相比非常小,您仍然可能会遇到内存不足错误。

内存不足错误的类型

内存不足错误主要以两种形式出现

OutOfMemoryException

大多数情况下,DuckDB 会因 OutOfMemoryException 而内存不足。例如

duckdb.duckdb.OutOfMemoryException: Out of Memory Error: failed to pin block of size 256.0 KiB (476.7 MiB/476.8 MiB used)

OOM Reaper (Linux)

许多 Linux 发行版都包含OOM killer 或 OOM reaper 进程,其目标是防止内存超额使用。如果 OOM reaper 杀死了您的进程,您通常会在 DuckDB 运行的地方看到以下消息:

Killed

要获取更详细的信息,请使用 dmesg 命令检查诊断消息(您可能需要 sudo 权限)。

sudo dmesg

如果进程被 OOM killer/reaper 杀死,您会找到类似这样的条目:

[Fri Apr 18 02:04:10 2025] Out of memory: Killed process 54400 (duckdb) total-vm:1037911068kB, anon-rss:770031964kB, file-rss:0kB, shmem-rss:0kB, UID:1000 pgtables:1814612kB oom_score_adj:0

内存不足错误的故障排除

为了防止内存不足错误,请尝试减少内存使用量。为此,请查阅“如何调整工作负载”页面。简而言之:

  • 使用 SET threads = ... 命令减少线程数。
  • 如果您的查询从文件中读取大量数据或写入大量数据,请尝试将 preserve_insertion_order 选项设置为 falseSET preserve_insertion_order = false
  • 将内存限制降低到默认的 80% 以下(参见限制页面)。这会很有帮助,因为某些 DuckDB 操作会绕过缓冲区管理器,并可能保留超出内存限制的内存。如果您发现这种情况,请使用 SET memory_limit = ... 将内存限制设置为系统总内存的 50-60%。
  • 将查询拆分为子查询。这可以帮助您查看中间结果在哪里“膨胀”,导致查询内存不足。

另请参阅

有关 DuckDB 内存管理的更多信息,请参阅“DuckDB 中的内存管理”博客文章