[О блоге]
[наверх]
[пред]
[2022-07-15 00:15:38+03:00]
[8e24a68248865cfcd58538871f8b96e6327376d8]
Темы: [go][zfs]
Написал glocate утилиту
http://www.git.stargrave.org/?p=glocate.git;a=summary
На фоне медленности поиска на HDD с 17.5M файлов и отсутствия быстрых
средств инкрементального обновления locate БД
(22b9eb13c837497c09b0d17e11cffac8aa655999), написал свою утилиту для
индексации файлов и их обновления. Пока жутко прежутко черновая версия,
но вроде работает как задумывал.
Сначала она пробегает по всей иерархии в текущей директории и составляет
отсортированные списки файлов с размерами и mtime-ом. Это хранит в виде
gob-файла (сериализация родная в Go) сжатого zstd. Для любого вывода
полностью загружает и декомпрессирует его в памяти.
Умеет выводить красивый вывод для человека (замена tree), типа:
├ music/HARTE/ №0 [283 GiB] 2022-05-10
│ ├ 324-Boutoku_No_Taiyo/ №1 [33 MiB] 2020-12-10
│ │ ├ 01.Silence_Before_Silver_Screen.mp3 №1 [3.7 MiB] 2016-10-13
│ │ ├ 02.Quarter_Moon.mp3 №2 [1.6 MiB] 2016-10-13
│ │ ├ 03.Red_Origin_Still_Streaming.mp3 №3 [2.0 MiB] 2016-10-13
│ │ ├ 04.Plastic_Dream.mp3 №4 [2.9 MiB] 2016-10-13
│ │ ├ 05.Japanese_Title.mp3 №5 [1.6 MiB] 2016-10-13
│ │ ├ 06.Disgusting_Flower.mp3 №6 [2.4 MiB] 2016-10-13
│ │ ├ 07.Swinging_Skull.mp3 №7 [1.3 MiB] 2016-10-13
│ │ ├ 08.Broken_Clock.mp3 №8 [2.1 MiB] 2016-10-13
│ │ ├ 09.Crawl_In_The_Transparency.mp3 №9 [1.6 MiB] 2016-10-13
│ │ ├ 10.New_Demention.mp3 №10 [2.2 MiB] 2016-10-13
│ │ ├ 11.Cobalt.mp3 №11 [1.9 MiB] 2016-10-13
│ │ ├ 12.Flash_Rings_Link.mp3 №12 [2.6 MiB] 2016-10-13
│ │ ├ 13.Moc.mp3 №13 [2.9 MiB] 2016-10-13
│ │ └ 14.Glenghost.mp3 №14 [4.1 MiB] 2016-10-13
│ ├ 7_H.Target-2011-Fast-Slow_Demolition/ №2 [293 MiB] 2020-09-06
│ │ ├ 01.Transmutation_Energy_Machine.wv №1 [17 MiB] 2020-09-06
│ │ ├ 02.Technosex.wv №2 [17 MiB] 2020-09-06
│ │ ├ 03.Metal+Flesh.wv №3 [25 MiB] 2020-09-06
│ │ ├ 04.Drill_Penis.wv №4 [18 MiB] 2020-09-06
вывод дружелюбный к парсингу компьютером:
303730496828 2022-05-10 music/HARTE/
34290985 2020-12-10 music/HARTE/324-Boutoku_No_Taiyo/
3875800 2016-10-13 music/HARTE/324-Boutoku_No_Taiyo/01.Silence_Before_Silver_Screen.mp3
[...]
4292087 2016-10-13 music/HARTE/324-Boutoku_No_Taiyo/14.Glenghost.mp3
306921714 2020-09-06 music/HARTE/7_H.Target-2011-Fast-Slow_Demolition/
17598286 2020-09-06 music/HARTE/7_H.Target-2011-Fast-Slow_Demolition/01.Transmutation_Energy_Machine.wv
18076892 2020-09-06 music/HARTE/7_H.Target-2011-Fast-Slow_Demolition/02.Technosex.wv
и просто вывод списка полных путей. Для всего этого можно указать
какой-то префикс, чтобы только часть иерархии показывалась. Именно это я
и сделал для вывода "тяжёлых" музыкальных альбомов своих.
Собственно, сам поиск утилита не делает: или суй в grep или fzf
какой-нибудь. Загружается этот файл в течении нескольких секунд.
Скорость создания БД -- упирается исключительно в IO у меня. Почти
столько же времени занимает что и просто сделать find по ФС. Вот правда
для 16TB раздела процесс под конец занимал почти 3.5GB. Загруженный в
память, при "штатном" использовании: отнимает 2GB. В общем то совсем не
мало, но я и не заморачивался экономией ресурсов и мне даже и так будет
удовлетворительно. БД для 17.5M файлов у меня заняла 128MB, что по моему
вполне себе терпимо. С ходу пришла мысль о том, что можно не хранить
размеры директорий: сжаться должно лучше, в надежде что это ни капли не
затормозит загрузку файла.
Ну и главная фишка: утилите можно скормить выхлоп zfs diff | sort -r и
все его действия (добавление, удаление, переименования, изменение) будут
применяться к загруженному состоянию, а дальше атомарно обновлено на
диске. Узнать какие изменения были произведены быстрее zfs diff-а всё
равно никто не сможет. zfs diff приятен тем, что его вывод,
отсортированный в обратном направлении, буквально говорит что и как надо
поочерёдно удалить и что обновить касательно mtime-а.
[оставить комментарий]