170 похожих чатов

Всем привет! Вопрос, возможно, не прямо по node, а в

целом по CS. Где можно почитать про индексацию файловой системы? Что конкретно интересует - ультра-быстрый поиск файла по регулярному выражению. Очевидно, что можно один раз построить дерево конкретной директории и сохранить в json, потом считать его и быстро искать по нему. Но как быть с изменениями? Существует ли возможность быстро обнаруживать изменения? Например, git же как-то мгновенно видит, какие файлы были изменены, как бы много их в репозитории не было.

48 ответов

42 просмотра

можно подписаться на изменения содержимого директории

nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_class_fs_fswatcher

.sha- Автор вопроса

Да, слышал что-то про подписку на изменения, но это работает в случае, если программа запущена и может их отслеживать А у меня флоу такой: программа запустилась, отработала, проиндексировала результаты. В следующий раз может быть запущена через неделю, должна подхватить старый индекс, быстро пройти по изменениям, если они были, и выполнить основную функцию - поиск файлов

git узнает об изменениях только когда его просят git status, например. И он обходит все файлы и папки. Добавь огромное кол-во файлов и увидишь, что git status начнет думать.

.sha- Автор вопроса

Понятно, что он узнает о них только при выполнении команды Ну вот я сделал директорию с вложенными папками, суммарно тысяч 15 файлов. Нормально работает

Посмотри исходники Гита и сделай как у них 🤷‍♂

ты пытаешься переизобрести locate/updatedb?

.sha- Автор вопроса

Да, я сейчас их читаю, но пока сложновато понять, где же именно это происходит из тысяч строк кода на си

.sha- Автор вопроса

хм. я не слышал об этом, сейчас загуглю

и нужно еще понимать, как именно файлы будут обновляться. То есть если это происходит, например, с помощью какого-то подконтрольного тебе GUI/приложения, то очень просто навесить "хук" на операции по удалению/обновлению/созданию файлов и с помощью этого хука вызывать обновление дерева или еще чего-то.

.sha- Автор вопроса

Нет, это не могу контролировать никак

.sha- Автор вопроса

линуксовая тулза… Не хотелось бы завязываться на конкретную ОС/платформу

исходники наверняка на c, собери под винду

.sha- Автор вопроса

Я не хочу говорить это каждому скачавшему мой node-пакет )

Файлами занимается файловая система, фс бывают разные. Реализуются фс в основном операционными системами. Вряд ли на жс ты напишешь свою фс, которая быстрее. Я про фс читал в книге « Операционные системы» Таненбаум. На ютуб можешь поискать — Кетов, устройство линукс.

.sha- Автор вопроса

я не собираюсь делать свою fs мне лишь нужно обнаруживать изменения в рабочем дереве по сравнению с заданным снапшотом, так же, как это делает гит

гит не отслеживает изменения в реальном времени, а только после вызова команды git status. Я так понимаю, что он сканирует директорию именно в этот момент.

если не принципиально жс https://github.com/radovskyb/watcher

У гита сложный алгоритм, также как и у rsync, но гит еще и самая сложная утилита. в принципе где то про это даже писали. Поэтому если нужно чесать ещё и изменения внутри текстовых файлов, то это гит, а если чекать изменения то нужен индекс на основе b tree

Попробуйте захэшить вывод directory-tree, filehound или node-dir Если хэш поменялся, значит есть изменения в структуре/файлах

.sha- Автор вопроса

Я это понимаю. Мне тоже не надо отслеживать в реальном времени, только при запуске приложения

.sha- Автор вопроса

Изменения внутри не надо чекать, по сути нужно только уметь обнаруживать, что файлы были удалены или добавлены, всё

Вот та либа что я кинул делает то что надо

и в твоём коде на ноде это долго вычисляется? ты не пытаешься запараллелить чтения директорий, зафигачить всё через promise.all, например?

Так это гошная либа ) и не факт, что она между запусками определяет

.sha- Автор вопроса

Да, долго. 70 секунд в базовом варианте. Уже как только не пытался параллелить, даже выносом в workerpool и child_process. Предел — 8 секунд пока достигнуть удалось. Но это тоже очень долго

.sha- Автор вопроса

знаю, как b-tree работает в базах данных. А тут как применить что-то не представляю

нет смысла выносить куда-то надо просто все дисковые операции делать последовательно если это какая-то тулза, то можно и синхронные методы использовать 8 секунд тоже звучит как-то много для простого сканирования директорий

Посмотри может, как работает нодемон или похожие тулзы

.sha- Автор вопроса

directory-tree: 90 секунд

.sha- Автор вопроса

ну простое-то да, просто файлов много. что-то в районе 50к

fsevents но топик о том, как отследить между запусками

.sha- Автор вопроса

++

так в итоге ты ничего не параллелишь? все обращения к fs осуществляешь последовательно?

Какая файловая система? Или все нужны?

.sha- Автор вопроса

Да я по-разному уже пробовал. Синхронно читать, на промисах, на дочерних процессах

.sha- Автор вопроса

желательно без завязок. вообще linux

.sha- Автор вопроса

Для меня выглядит так, что как ни оптимизируй без предварительного хранения какого-то индекса никак не получится

В zfs используется cow поэтому там что поменялась может сама система сказать по снепшотам

Так, а зачем между запусками? Запустился, прочитал диру и дальше вотчишь изменения. Так не годится?

Храните хэш директорий, если не поменялся, можно её пропустить

Если это бэкап Тула которую раз в неделю запускают?

.sha- Автор вопроса

Да, логично, а от чего брать этот хэш? Время изменения не прорастает в статистику директории (

.sha- Автор вопроса

use-case такой: тулза может лежать неделями. Потом юзер пришел, запустил ее, она должна быстро отработать, потом снова может лежать неделями

А. То есть вам не события изменения нужно отслеживать, а разницу. Понял.

mtime например

.sha- Автор вопроса

было бы идеально. Но я попробовал, mtime меняется только у директории уровнем выше. а те, которые выше на 1, 2, 3 уровня уже не меняются

mtime меняется при добавлении файла, удалении или переименовании существующего, изменения в файле не баблятся

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта