Zum Inhalt springen

Out-of-Memory-Probleme

Konfigurationsoptionen

Wenn Sie in DuckDB Out-of-Memory-Probleme haben, versuchen Sie, die folgenden Konfigurationsoptionen anzupassen:

  • Reduzieren Sie die Thread-Anzahl mit dem Befehl SET threads = ....
  • Ein niedrigeres Speicherlimit als die Standard-80 % kann Out-of-Memory-Fehler verhindern. Diese Einstellung klingt kontraintuitiv, hilft aber, weil einige DuckDB-Operationen den Buffer-Manager der Datenbank umgehen und so mehr Speicher reservieren können als das Speicherlimit erlaubt. Geschieht das (z. B. wird DuckDB vom Betriebssystem oder einem OOM-Reaper beendet), setzen Sie das Speicherlimit mit der Anweisung SET memory_limit = '...' auf nur 50–60 % des gesamten Systemspeichers.
  • Liest Ihre Abfrage eine große Datenmenge aus einer Datei oder schreibt sie eine große Datenmenge, setzen Sie die Option preserve_insertion_order auf false: SET preserve_insertion_order = false.

Kurz gesagt, versuchen Sie die Einstellungen:

SET threads = ⟨lower_than_the_number_of_available_threads⟩;
SET memory_limit = ⟨lower_than_80%_of_system_memory⟩;
SET preserve_insertion_order = false;

Schema und Indizes

In speicherarmen Umgebungen können kleinere Datentypen (z. B. TINYINT) den Speicher- und Festplattenbedarf einer Abfrage senken. DuckDBs Bitpacking-Kompression bedeutet, dass kleine Werte in größeren Datentypen auf der Festplatte nicht mehr Platz belegen, während der Verarbeitung aber mehr Speicher brauchen – daher ist es nötig, beim Anlegen von Spalten möglichst restriktive Typen zu verwenden, um den Speicherverbrauch zu senken.

Indizes können den Speicherverbrauch erheblich steigern. Außerdem sind sie derzeit nicht buffer-verwaltet. Vermeiden Sie Indizes nach Möglichkeit. Erfordert Ihr Workload das Indizieren großer Tabellen, senken Sie das Speicherlimit, um dem Rechnung zu tragen.