luadbi和luasql两种lua duckdb驱动的性能对比

利用自定义函数输出各种类型数据的luadbi驱动ducktpch.lua

lua 复制代码
DBI = require "DBI"

dbd, err = DBI.Connect( 'DuckDB', 'tpch_duckdb', 'dbuser', 'password' )
assert(dbd, err)

dbd:autocommit(true)


statement = assert(dbd:prepare( "SELECT * from lineitem" ))
statement:execute()
tabcol={}
tabval={}
i=1
for row in statement:rows(true) do

if (i==1)
then
 for key, value in pairs(row) do tabcol[i]=key i=i+1 end
 headerstring=table.concat(tabcol, ",")
 print(headerstring)
end


for key, value in pairs(tabcol)do tabval[key]=row[tabcol[key]] end
rowstring=table.concat(tabval, ",")
print(rowstring)
end

利用duckdb C API函数duckdb_value_varchar输出各种类型数据的字符串的luasql驱动ducktpch2.lua

lua 复制代码
driver = require"luasql.duckdb"

env = assert (driver.duckdb())

con = assert (env:connect("tpch_duckdb"))

cur = assert (con:execute"SELECT * from lineitem")

row = cur:fetch ({}, "a")	-- the rows will be indexed by field names

tabcol={}
i=1
for key, value in pairs(row) do tabcol[i]=key i=i+1 end
headerstring=table.concat(tabcol, ",")
print(headerstring)

tabval={}

while row do
for key, value in pairs(tabcol)do tabval[key]=row[tabcol[key]] end
rowstring=table.concat(tabval, ",")
print(rowstring)
  row = cur:fetch (row, "a")	-- reusing the table of results
end

执行结果

复制代码
root@66d4e20ec1d7:/par/luadbi# lua ../ducktpch.lua
l_linestatus,l_linenumber,l_comment,l_tax,l_commitdate,l_extendedprice,l_shipdate,l_suppkey,l_partkey,l_receiptdate,l_shipmode,l_returnflag,l_discount,l_shipinstruct,l_quantity,l_orderkey
O,1,to beans x-ray carefull,0.02,1996-02-12,24386.67,1996-03-13,785,15519,1996-03-22,TRUCK,N,0.04,DELIVER IN PERSON,17.00,1

root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpch.lua >/dev/null

real	0m7.979s
user	0m7.756s
sys	0m0.352s


root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpch2.lua >/dev/null

real	0m9.301s
user	0m8.424s
sys	0m1.140s

root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpch.lua >/tmp/1.csv 

real	0m9.137s
user	0m8.196s
sys	0m1.096s
root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpch2.lua > /tmp/2.csv

real	0m9.905s
user	0m8.636s
sys	0m1.296s

ls -l /tmp/1.csv  /tmp/2.csv
-rw-r--r-- 1 root root 75524898 Nov  3 14:59 /tmp/1.csv
-rw-r--r-- 1 root root 75448328 Nov  3 15:00 /tmp/2.csv

两种驱动没有明显差异。

如果把print到控制台再重定向改为直接对文件写操作,则性能提升,不过这与duckdb驱动无关。

lua 复制代码
-- 以附加的方式打开只写文件
file = io.open("testlua.csv", "a")

-- 设置默认输出文件为 test.lua
io.output(file)
io.write(headerstring)
io.write("\n")

while row do
 for key, value in pairs(tabcol)do tabval[key]=row[tabcol[key]] end
local rowstring=table.concat(tabval, ",")
-- print(rowstring)
io.write(rowstring)
io.write("\n")
  row = cur:fetch (row, "a")	-- reusing the table of results
end
-- 关闭打开的文件
io.close(file)

排除print慢的操作,都用直接写文件来对比,还是平局。

复制代码
root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpchf.lua 

real	0m8.632s
user	0m8.096s
sys	0m0.136s


root@66d4e20ec1d7:/par/luadbi# time lua ../ducktpch2f.lua 

real	0m7.259s
user	0m7.068s
sys	0m0.348s

完整直接写文件脚本如下

luadbi ducktpchf.lua

lua 复制代码
DBI = require "DBI"

dbd, err = DBI.Connect( 'DuckDB', 'tpch_duckdb', 'dbuser', 'password' )
assert(dbd, err)

dbd:autocommit(true)


statement = assert(dbd:prepare( "SELECT * from lineitem" ))
statement:execute()
tabcol={}
tabval={}
i=1

-- 以附加的方式打开只写文件
file = io.open("testlua.csv", "w")

-- 设置默认输出文件为 test.lua
io.output(file)


for row in statement:rows(true) do

if (i==1)
then
 for key, value in pairs(row) do tabcol[i]=key i=i+1 end
 headerstring=table.concat(tabcol, ",")
 print(headerstring)
 io.write(headerstring)
io.write("\n")
end


for key, value in pairs(tabcol)do tabval[key]=row[tabcol[key]] end
rowstring=table.concat(tabval, ",")
-- print(rowstring)
io.write(rowstring)
io.write("\n")
end
-- 关闭打开的文件
io.close(file)

luadbi ducktpch2f.lua

lua 复制代码
driver = require"luasql.duckdb"

env = assert (driver.duckdb())

con = assert (env:connect("tpch_duckdb"))

cur = assert (con:execute"SELECT * from lineitem")

local row = cur:fetch ({}, "n")	-- the rows will be indexed by field number

local tabcol={}
i=1
for key, value in pairs(row) do tabcol[i]=key i=i+1 end
local headerstring=table.concat(tabcol, ",")
print(headerstring)

local tabval={}

-- 以附加的方式打开只写文件
file = io.open("testlua.csv", "w")

-- 设置默认输出文件为 test.lua
io.output(file)
io.write(headerstring)
io.write("\n")
while row do
 for key, value in pairs(tabcol)do tabval[key]=row[tabcol[key]] end
local rowstring=table.concat(tabval, ",")
-- print(rowstring)
io.write(rowstring)
io.write("\n")
  row = cur:fetch (row, "n")	-- reusing the table of results
end
-- 关闭打开的文件
io.close(file)
相关推荐
MATLAB代码顾问20 小时前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
万粉变现经纪人1 天前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
清风明月一壶酒1 天前
OpenClaw自动处理Word文档全流程
开发语言·c#·word
其实防守也摸鱼1 天前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
小郑加油1 天前
python学习Day12:pandas安装与实际运用
开发语言·python·学习
AC赳赳老秦1 天前
投标合规提效:用 OpenClaw 实现标书 / 合同自动审核、关键词校验、格式优化,降低废标风险
开发语言·前端·python·eclipse·emacs·deepseek·openclaw
KuaCpp1 天前
C++面向对象(速过复习版)
开发语言·c++
wbs_scy1 天前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
2zcode1 天前
基于MATLAB元胞自动机(CA)的AZ80A镁合金动态再结晶(DRX)过程模拟
开发语言·matlab·动态再结晶
iCxhust1 天前
微机原理实践教程(C语言篇)---A001闪烁灯
c语言·开发语言·汇编·单片机·嵌入式硬件·51单片机·微机原理