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×tamp=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。
我正在通过 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×tamp=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。