使用 DuckDB 和 Julia 逐块读取镶木地板

问题描述 投票:0回答:1

我尝试过以下代码:

con = DBInterface.connect(DuckDB.DB)
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)

但它并不是真正的分块阅读。相反,它尝试读取单个结果中的整个

1000000000000
行并炸毁我的 RAM。 不过,我从测试中得到了这段代码。

我错过了什么吗?

julia duckdb
1个回答
0
投票
查看代码我非常怀疑这实际上是在创建流结果。 Julia 包不再维护,并且此测试可能同时已悄然中断。

可以使用 MaterializedResult 或 StreamResult 来创建

Stmt

 对象

function execute(con::Connection, sql::AbstractString, params::DBInterface.StatementParams) stmt = Stmt(con, sql, MaterializedResult) try return execute(stmt, params) finally _close_stmt(stmt) # immediately close, don't wait for GC end end
这似乎总是创建一个 MaterializedResult

您可以将其分解并用 StreamResult 替换 MaterializedResult ,它应该可以工作。

© www.soinside.com 2019 - 2024. All rights reserved.