Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重构数据结构,并使用 sqlite 进行查询 #8

Open
wants to merge 31 commits into
base: main
Choose a base branch
from

Conversation

zxhd863943427
Copy link

@zxhd863943427 zxhd863943427 commented Jul 22, 2024

该提交主要完成下面的工作:

  1. 重构了 cardsource、card 的结构
  2. 增加 history 和 reviewLog 结构,以满足撤回和导出复习历史的需要。
  3. 改为使用内存级sqlite进行 crud ,保存时导出为json。
  4. 目前已完成部分原有api,仍有一部分接口等待实现(另外感觉使用 sqlite 进行 CRUD 后一部分接口似乎不需要专门实现了?)

数据结构具体看代码,在 2万 cardSource 、10万 card 的性能如下所示:

图片

其中

task init card and cardsource use time :29.8242217s

是测试生成待插入卡片的耗时。总体而言,我觉得足以满足闪卡系统的使用需求。

@88250 看一下这样做是否可以接受。

另外, 为了快速开发,使用了 modernc.org/sqlite (无cgo,提高打包速度)和 xorm.io/xorm (辅助CRUD),如果可行,可以替换回 kernel 使用的 github.com/mattn/go-sqlite3 并逐步去除 xorm的使用。

@Jiangshuon
Copy link

Jiangshuon commented Jul 23, 2024

Z佬666!静待D大旅游归来!

@88250
Copy link
Member

88250 commented Jul 24, 2024

#6 的关系是?

@zxhd863943427
Copy link
Author

复用了部分数据结构,但基本相当于重写,因为我感觉一些组合查询要求使用原来的方法很难实现。

Copy link
Member

@88250 88250 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

另外,还需要考虑已有数据的迁移。

.vscode/launch.json Outdated Show resolved Hide resolved
card.go Outdated Show resolved Hide resolved
@zxhd863943427
Copy link
Author

zxhd863943427 commented Jul 25, 2024

我更改了review的接口,使得它跟旧版更为相似。缺点是:

  1. reiview会使用更长时间。
  2. 撤回并重新复习的设计会更复杂一点。

不过我觉得批量复习的场景还是少见的,10万张卡片总用时16秒,相当于每张卡片0.16毫秒,性能再差几倍也不是太大问题。
之前的测试:
图片
现在的测试:
图片

当前的接口:

Review(cardID string, rating Rating)

…add functionality for scheduling based on priority.
@zxhd863943427
Copy link
Author

当前版本增加了缓存,极大提升了查询性能和一般情况下的保存性能,可以在在600ms内返回10万卡片量级的结果。借用缓存也提升了 review 的性能,使其达到 api 修改前的速度。

图片

@88250
Copy link
Member

88250 commented Sep 12, 2024

麻烦抽空解决一下冲突。

@Jiangshuon
Copy link

@88250 终于开始了!d大,大概还有几个版本才会进入3.2.0呀

@88250
Copy link
Member

88250 commented Sep 12, 2024

@Jiangshuon 争取今年年内吧。

@zxhd863943427
Copy link
Author

麻烦抽空解决一下冲突。

api变化有点大,git自动合并扑街了,我需要抽时间看看。

@zxhd863943427
Copy link
Author

@88250 测试dejavu的时候尝试了下跟sqlite的兼容性,发现情况如下:

在使用sqlite.db储存时,在写入的情况下,开启wal模式后,只要不读shm、wal就没多大问题。journal比较麻烦一点,写入太快了,在持续写入情况下,建立了快照后文件就更新了。在读的情况下,都没啥问题。所以sqlite作为储存方式对于dejavu是可行的,只不过最好在写入的时候获取filelock的锁。

@88250
Copy link
Member

88250 commented Sep 21, 2024

dejavu 不考虑改数据库,用文件系统更好一些。

@zxhd863943427
Copy link
Author

zxhd863943427 commented Sep 22, 2024

@88250 不是 dejavu 自己使用数据库,而是 riff 或者其他思源的组件可以考虑使用数据库进行数据储存,这不会造成问题。

@88250
Copy link
Member

88250 commented Sep 22, 2024

具体是什么组件,这个要单独分析可行性。

@zxhd863943427
Copy link
Author

看了一下,感觉riff和dataview都是可以用sqlite储存的,riff我觉得可以尝试一下,dataview就以后再说吧。

@kx1356
Copy link

kx1356 commented Oct 25, 2024

最近有什么进展消息吗?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants