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

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

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

48 ответов

5 просмотров

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

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 меняется при добавлении файла, удалении или переименовании существующего, изменения в файле не баблятся

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта