QuestDB 批量 CSV 导入 - java 进程内存不足

QuestDB mass CSV import - java process Out Of Memory

我正在通过 bash 脚本(循环文件列表)将 CSV 文件(200M+ 记录)大量导入 docker 中的 QuestDB 运行。随着时间的推移,我可以看到 java 进程的内存使用量逐渐增加到 OOM (16GB) 的程度。即使在提前终止导入脚本后,java 进程的内存使用率保持在同一水平,直到我重新启动容器。

Bash 导入脚本:

for table in "${tickdb_tables[@]}"; do
  
  symbol=$(echo $table| cut -d'_' -f 1)

  curl  -i -F \
  schema='[{"name":"ts", "type": "TIMESTAMP", "pattern": "yyyy-MM-dd HH:mm:ss"},{"name":"symbol", "type": "SYMBOL"},{"name":"open","type":"FLOAT"},{"name":"high","type":"FLOAT"},{"name":"low","type":"FLOAT"},{"name":"close","type":"FLOAT"},{"name":"volume","type":"INT"},{"name":"timeframe","type":"SYMBOL"}]' \
   -F data=@$symbol.csv "http://localhost:9000/imp?name=CANDLES&timestamp=ts"

  rm $symbol.csv

  sleep 5
done

Table 创建语句:

create table CANDLES (ts TIMESTAMP, symbol SYMBOL, open FLOAT, high FLOAT, low FLOAT,
                      close FLOAT, volume INT, timeframe SYMBOL) 
timestamp(ts) partition by MONTH;

我在这里遗漏了什么,还是 QuestDb 中有潜在的 bug/memory 泄漏? (不想打开问题,直到我确定我没有做错什么)

我认为这是怎么回事,您按 MONTH 分区,一个月的数据不适合您的 RAM。当您按符号执行时发生乱序摄取数据时,每次加载新符号文件时,摄取过程都必须重写每月分区。可能在某些时候分区不适合 RAM 并且 QuestDB 失败。

尝试将分区更改为 DAY。如果可能,将您的 csv 文件拆分为每天并按每日部分加载它们。或者,如果您不打算一起查询它们,则为每个符号创建一个 table。