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_orderauffalse: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.