这里有个Elisp的ORM包
closql依赖 GitHub - magit/emacsql: A high-level Emacs Lisp RDBMS front-end ,emacsql的问题是每次调用都是启动一个子进程,通过子进程调用,性能非常差。sqlite一般在一个进程内部直接调用。
我说的 GitHub - syohex/emacs-sqlite3: sqlite3 binding of Emacs Lisp 是以modules的形式调用sqlite的动态链接库,把sqlite数据库加载到进程。
改了一下pyim,用sogou的39万数据量的词库测试。sqlite数据库在磁盘上,未使用内存数据库的情况下,执行一次select平均在0.0003秒左右。
没有每次调用都要启动子进程的说法,我猜你没仔细看过emacsql的源代码。
事实上,只要保持住对数据库对象的引用不触发finalizer,每个emacsql
都是对原有的进程发送SQL语句,而不是新建进程
你可能看的是emacsql-with-connection
的用法,那个宏只是为单次查询方便而设计的。
大概看了一下 emacsql/Makefile at main · magit/emacsql · GitHub ,生成了可执行文件 emacsql-sqlite
,这个应该是个代理。最开始找emacs支持sqlite的包的时候,就了解了一下emacsql和其他几个包。最后选择了emacs-sqlite3
emacs-sqlite3已经玩得很开心了。不敢再随便换着玩了。
正常像其他程序使用sqlite,一般都是把使用sqlite的代码编译到程序,调用sqlite的动态链接库。
https://github.com/syohex/emacs-sqlite3
是把调用sqlite的api编译成一个动态库,emacs(我的是win10上自己编译的,可能–with-modules是默认打开了)可以调用。
这个要看 elisp 返回搜索的词条后,要花多长时间,接口速度太慢也不行
性质不一样,emacsql是ORM,emacsql-sqlite3是与sqlite交互的后端,我给emacsql写过一个用sqlite3 CLI的后端,正好也叫emacsql-sqlite3,把他在melpa上的名字占去了,哈哈哈
执行这段后,正常了
pyim 可以做到吗