целом по CS. Где можно почитать про индексацию файловой системы? Что конкретно интересует - ультра-быстрый поиск файла по регулярному выражению. Очевидно, что можно один раз построить дерево конкретной директории и сохранить в json, потом считать его и быстро искать по нему. Но как быть с изменениями? Существует ли возможность быстро обнаруживать изменения? Например, git же как-то мгновенно видит, какие файлы были изменены, как бы много их в репозитории не было.
можно подписаться на изменения содержимого директории
nodejs.org/dist/latest-v12.x/docs/api/fs.html#fs_class_fs_fswatcher
Да, слышал что-то про подписку на изменения, но это работает в случае, если программа запущена и может их отслеживать А у меня флоу такой: программа запустилась, отработала, проиндексировала результаты. В следующий раз может быть запущена через неделю, должна подхватить старый индекс, быстро пройти по изменениям, если они были, и выполнить основную функцию - поиск файлов
git узнает об изменениях только когда его просят git status, например. И он обходит все файлы и папки. Добавь огромное кол-во файлов и увидишь, что git status начнет думать.
Понятно, что он узнает о них только при выполнении команды Ну вот я сделал директорию с вложенными папками, суммарно тысяч 15 файлов. Нормально работает
Посмотри исходники Гита и сделай как у них 🤷♂
ты пытаешься переизобрести locate/updatedb?
Да, я сейчас их читаю, но пока сложновато понять, где же именно это происходит из тысяч строк кода на си
хм. я не слышал об этом, сейчас загуглю
и нужно еще понимать, как именно файлы будут обновляться. То есть если это происходит, например, с помощью какого-то подконтрольного тебе GUI/приложения, то очень просто навесить "хук" на операции по удалению/обновлению/созданию файлов и с помощью этого хука вызывать обновление дерева или еще чего-то.
Нет, это не могу контролировать никак
линуксовая тулза… Не хотелось бы завязываться на конкретную ОС/платформу
исходники наверняка на c, собери под винду
Я не хочу говорить это каждому скачавшему мой node-пакет )
Файлами занимается файловая система, фс бывают разные. Реализуются фс в основном операционными системами. Вряд ли на жс ты напишешь свою фс, которая быстрее. Я про фс читал в книге « Операционные системы» Таненбаум. На ютуб можешь поискать — Кетов, устройство линукс.
я не собираюсь делать свою fs мне лишь нужно обнаруживать изменения в рабочем дереве по сравнению с заданным снапшотом, так же, как это делает гит
гит не отслеживает изменения в реальном времени, а только после вызова команды git status. Я так понимаю, что он сканирует директорию именно в этот момент.
если не принципиально жс https://github.com/radovskyb/watcher
У гита сложный алгоритм, также как и у rsync, но гит еще и самая сложная утилита. в принципе где то про это даже писали. Поэтому если нужно чесать ещё и изменения внутри текстовых файлов, то это гит, а если чекать изменения то нужен индекс на основе b tree
Попробуйте захэшить вывод directory-tree, filehound или node-dir Если хэш поменялся, значит есть изменения в структуре/файлах
Я это понимаю. Мне тоже не надо отслеживать в реальном времени, только при запуске приложения
Изменения внутри не надо чекать, по сути нужно только уметь обнаруживать, что файлы были удалены или добавлены, всё
Вот та либа что я кинул делает то что надо
и в твоём коде на ноде это долго вычисляется? ты не пытаешься запараллелить чтения директорий, зафигачить всё через promise.all, например?
Так это гошная либа ) и не факт, что она между запусками определяет
Да, долго. 70 секунд в базовом варианте. Уже как только не пытался параллелить, даже выносом в workerpool и child_process. Предел — 8 секунд пока достигнуть удалось. Но это тоже очень долго
знаю, как b-tree работает в базах данных. А тут как применить что-то не представляю
нет смысла выносить куда-то надо просто все дисковые операции делать последовательно если это какая-то тулза, то можно и синхронные методы использовать 8 секунд тоже звучит как-то много для простого сканирования директорий
Посмотри может, как работает нодемон или похожие тулзы
directory-tree: 90 секунд
ну простое-то да, просто файлов много. что-то в районе 50к
fsevents но топик о том, как отследить между запусками
++
так в итоге ты ничего не параллелишь? все обращения к fs осуществляешь последовательно?
Какая файловая система? Или все нужны?
Да я по-разному уже пробовал. Синхронно читать, на промисах, на дочерних процессах
желательно без завязок. вообще linux
Для меня выглядит так, что как ни оптимизируй без предварительного хранения какого-то индекса никак не получится
В zfs используется cow поэтому там что поменялась может сама система сказать по снепшотам
Так, а зачем между запусками? Запустился, прочитал диру и дальше вотчишь изменения. Так не годится?
Храните хэш директорий, если не поменялся, можно её пропустить
Если это бэкап Тула которую раз в неделю запускают?
Да, логично, а от чего брать этот хэш? Время изменения не прорастает в статистику директории (
use-case такой: тулза может лежать неделями. Потом юзер пришел, запустил ее, она должна быстро отработать, потом снова может лежать неделями
А. То есть вам не события изменения нужно отслеживать, а разницу. Понял.
mtime например
было бы идеально. Но я попробовал, mtime меняется только у директории уровнем выше. а те, которые выше на 1, 2, 3 уровня уже не меняются
mtime меняется при добавлении файла, удалении или переименовании существующего, изменения в файле не баблятся
Обсуждают сегодня