使用DuckDB与Julia按块读取数据失败问题排查
解决DuckDB流式读取内存耗尽问题
问题出在DuckDB对简单查询的默认优化逻辑上——像range(1000000000000)这类极简查询,DuckDB会默认一次性生成全部结果集,忽略客户端的流式读取请求。你需要添加配置强制开启流式执行:
方案一:连接后执行配置语句
在建立连接后,先执行SET force_streaming = true;,强制DuckDB分块生成结果:
con = DBInterface.connect(DuckDB.DB) # 强制开启流式执行 DBInterface.execute(con, "SET force_streaming = true;") query = "SELECT * FROM range(1000000000000) t(i)" res = DBInterface.execute(con, query, DuckDB.StreamResult) # fetch the first three chunks for i in 1:3 chunk = DuckDB.nextDataChunk(res) DuckDB.destroy_data_chunk(chunk) end DBInterface.close!(res) DBInterface.close!(con) GC.gc(true)
方案二:连接时直接传入配置参数
也可以在建立连接时直接指定配置,省去单独执行SET语句的步骤:
con = DBInterface.connect(DuckDB.DB; force_streaming=true) query = "SELECT * FROM range(1000000000000) t(i)" res = DBInterface.execute(con, query, DuckDB.StreamResult) # 后续读取逻辑不变 for i in 1:3 chunk = DuckDB.nextDataChunk(res) DuckDB.destroy_data_chunk(chunk) end DBInterface.close!(res) DBInterface.close!(con) GC.gc(true)
修改后,DuckDB会按照分块方式生成结果,不会一次性加载全部1万亿行数据到内存中。
内容的提问来源于stack exchange,提问作者Lay González
相关产品推荐
相关产品推荐

