pivot遇到out of memory错误,有没有更好的解决方案?

我尝试在试用版中对一个4000万条数据的表进行pivot操作,表有三列:datetime, ticker, close, 提示out of memory错误。请问pivot操作是否特别消耗内存? 更细粒度的分区能否解决问题? 谢谢

login(admin,123456)
db=database("dfs://data")
close=loadTable(db,`close)
// select count(*) from close; 40450164
// select count(*) from select distinct(ticker) from close; 2244
// select count(*) from select distinct(datetime) from close; 23095
close_pivot = select close from close pivot by datetime, ticker

Error Message: Out of memory

请先 登录 后评论

1 个回答

Juntao Wang

按照你的数据量模拟了一个内存表,在4G内存限制的节点上跑了,没有出现OOM。数据表占用0.8G左右,最后生成的pivot表0.6G左右。中间过程还会需要一些内存。使用更细粒度的分区在这个case中并不会减少内存的使用。因为原始数据就是一个时间点一个股票一条数据,最后pivoting也需要这么多数据。使用分布式反而会增加一些中间数据的开销。

n = 40450164
syms ="c" + string(1..2204)
dts =  2020.01.01T00:00:00 + 1..23095 * 60
t = table(rand(syms, n) as sym, rand(dts, n) as datetime, rand(100.0, n) as close).sortBy!(`datetime`sym)
close_pivot = select close from t pivot by datetime, sym

建议节点重新启动,测试一下上面的代码,是否会造成OOM。

请先 登录 后评论