Skip to content

perf(vault/search): faster file-tree scan + cached notes_list index#51

Draft
kodinkod wants to merge 2 commits into
mainfrom
claude/nice-tesla-M3k0t
Draft

perf(vault/search): faster file-tree scan + cached notes_list index#51
kodinkod wants to merge 2 commits into
mainfrom
claude/nice-tesla-M3k0t

Conversation

@kodinkod

@kodinkod kodinkod commented May 29, 2026

Copy link
Copy Markdown
Member

Оптимизации работы с ФС на больших хранилищах. Две независимые правки.

1. read_dir_recursive — лишние stat при сортировке дерева

src-tauri/src/core/vault.rs. Компаратор сортировки вызывал Path::is_dir() и file_name() на каждое сравнение → скан папки делал O(n·log n) stat-сисколов и аллокаций вместо O(n). Теперь is_dir/имя вычисляются один раз на запись, сортировка идёт по закэшированным значениям. Поведение (следование симлинкам, «папки сначала → алфавит», ручной tree-order.json) — без изменений.

2. notes_list — SQLite-индекс заголовков с инвалидацией по mtime

notes_list обходил весь vault и читал+парсил каждый .md на каждый вызов (быстрый переключатель, автодополнение вики-ссылок, навигация, ячейки таблиц) — только ради заголовка. На больших хранилищах это секунды I/O и парсинга на вызов.

  • Новый модуль core/index.rs — отдельная БД <vault>/.mycel/index.db (независимо от AI-индекса, работает и без AI), таблица note_titles(path, mtime, title).
  • notes_list обходит каталог и читает/парсит только .md с изменившимся mtime; для остальных берёт заголовок из кэша. Самовосстанавливается (внешние правки → меняется mtime → перечитываем), вычищает записи удалённых/перемещённых файлов.
  • Зашифрованные .md.age не индексируются (заголовок = stem, без чтения файла).
  • Если индекс не открылся — прозрачный откат к полному сканированию.
  • Индекс открывается на vault_open и сбрасывается при смене vault (как AI-состояние).

Проверка

Установлены GTK/WebKit-зависимости, крейт собран. Юнит-тесты модуля индекса:

test core::index::tests::empty_batch_is_noop ... ok
test core::index::tests::upsert_updates_existing_row ... ok
test core::index::tests::upsert_then_load_roundtrips ... ok
test core::index::tests::delete_prunes_row ... ok
test result: ok. 4 passed; 0 failed

Полный cargo test --lib — без регрессий.

Это первый шаг плана по индексации. Следующие шаги (отдельными PR): добавить в индекс wikilinks → ускорить backlinks_get и graph_data; затем tagsnotes_by_tag.

https://claude.ai/code/session_01LVDQPy3hFcioM1EJBrreRt

The sort comparator in read_dir_recursive called Path::is_dir() and
file_name() on every comparison, turning a single folder scan into
O(n·log n) stat syscalls and string allocations. Resolve each entry's
directory-ness and name once up front and sort on the cached values.
Behaviour (symlink-following is_dir, dirs-first/alphabetical ordering,
manual tree-order) is unchanged.
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

notes_list walked the whole vault and read+parsed every .md on every
call (quick switcher, wikilink completion, navigation, table cells) just
to extract each note's title. On large vaults that is seconds of I/O and
parsing per invocation.

Add a per-vault metadata index at .mycel/index.db (core/index.rs,
separate from the AI index so it works without AI). notes_list now walks
the directory and only reads+parses .md files whose mtime changed since
the last scan; unchanged notes serve their title from the cache. The
cache is self-healing (external edits bump mtime -> re-read) and prunes
entries for deleted/moved files. Encrypted .md.age notes are never
indexed (title is the stem). If the index fails to open, the command
transparently falls back to the original full scan.

Opened on vault_open and reset on vault switch, mirroring AI state.
@kodinkod kodinkod changed the title perf(vault): precompute is_dir/name in file-tree scan perf(vault/search): faster file-tree scan + cached notes_list index May 29, 2026
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.

3 participants