LINUX.ORG.RU
ФорумTalks

Подсветка синтаксиса для огромных файлов

 ,


0

1

Представим, что юзер открывает файл размером 10гб в редакторе кода и пролистывает хоткеем в конец. Допустим, редактор умеет корректно работать без предварительной подгрузки всего файла в память (под ответственность юзера что файл никто со стороны не испортит в неожиданное время, или пусть вообще он в read-only режиме - просмотрщик кода). Как редактор кода должен себя вести в плане подсветки синтаксиса?

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

Варианты:

1) залагать и парсить подсветку этих 10 гб, и только когда оно доделалось отлагать и нарисовать всё

2) нарисовать конец файла без подсветки, парсить её в фоне (где-нить выводить % готовности) и как закончим - нарисовать с подсветкой

3) нарисовать конец файла с черновой подсветкой, распарсенной без учёта пролистанных мимо страниц (ну, возможно ещё захватить сколько-то кбайт/строк выше верхней границы видимости), в фоне парсить нормально и как дойдёт до конца - перерисовать

4,5) варианты 2,3 но в фоне ничего не парсить и так и оставить (ведь юзер может оказаться недоволен нагрузкой на диск или на проц, из-за которых лагают другие проги)

6) каждый раз в таких случаях спрашивать у юзера хочет ли он фоновый или нефоновый парсинг (в виде попап окна) и надо ли делать предварительную неточную но быструю подсветку

★★★★★

Файл кода на 10 гб? А зачем? Ну чисто теоретически.

Это что то на сишном?

Нет, ну серьезно, это задача из разряда: как запихать всю жвачку мира в рот и не разорвать хлебало.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)

в Емаксе сделан 4,5 вариант. В видимой области нет начала контекста - не будет правильной подстветки. Но распаршенный кусочек может подсветиться. В фоне ничего не делается. Мне с этим ок, я могу промотать пару страниц вверх и вернуться назад, если мне нужно чтобы подсветка всего последнего окна подхватилась.

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

И еще есть настройка быстрый строллинг, которая как раз включает такой режжим, что при прыжке не перечитывается весь файл.

masa ★★★
()
Последнее исправление: masa (всего исправлений: 4)
Ответ на: комментарий от LightDiver

Согласен, что 10гб файл именно с кодом это что-то странное. Но теоретически можно и такое представить, задачу это не отменяет.

Если более реалистичный сценарий, то в редакторе могут открывать не только код. Например, логи какие-нить (и в них тоже нужна подсветка). Варианты могут быть любые, или ты хочешь сказать что редактор для кода должен быть один, а для остальных текстовых файлов другой? Сомнительная затея, лишнее усложнение.

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

firkax ★★★★★
() автор топика
Ответ на: комментарий от firkax

А смысл в такой половинчатой подсветке? Вот давай посмотрим задачу иначе. Подсветка нужна для удобства. Чтобы понимать что вообще происходит.

И да, для кода давно есть специализированные редакторы - это нормально. А дальше будут все более специализированные.

Основная задача в формировании кода - удобная его структура изначально. Та же модульная, где у тебя в каждом файле будет своя функциональность, где каждый файл не будет настолько большим, чтобы это вызывало неудобство.

А для не кодового текста нужна совсем другая подсветка и другие способы обработки.

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

Даже современные ненавистные тобой ИИшки не читают весь код - да это и не надо. Они его парсят по структурам, находя нужные участки и работают точечно.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Смысл чтобы твой редактор не лагал, когда ты открываешь такой файл, например в IDEA эта проблема не решена, большой файл даже на 5 тысяч строк там будет тормозить, будет тормозить и выводе и особенно на инпуте, если не включить энергосберегающий режим - отключающий умные функции. Нормальные редаторы, типа емакса и вима, проглотят такие файлы без проблем.

masa ★★★
()
Ответ на: комментарий от masa

В саблим текст при правильном выборе языка даже файл на 15 тысяч строк не тормозит. Но! Если неправильно выбрать синтаксис, начинаются тормоза. Видать как то они решили это.

Но половинчатый синтаксис всеравно не выход. Это ты просто лишаешь себя части инфы, а тогда в чем смысл?

И опять же - даже в эти 15 тысяч строк я вместил с десяток отдельных больших классов, каждый из которых не более 3-4 тысяч строк. Легко разбить на десяток файлов поменьше.

Всетаки это задача не алгоримическая, а структурная и на железо.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

Но половинчатый синтаксис всеравно не выход. Это ты просто лишаешь себя части инфы, а тогда в чем смысл?

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

masa ★★★
()
Ответ на: комментарий от masa

Хм.. В саблиме реально это как то решили. Я сейчас открыл файл с таблицей луа на 6мб - 286 тысяч строк. Не тормозит. Подсветка есть. Но там не сложная структура.

Интересно, надо подумать.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LightDiver

И опять же - даже в эти 15 тысяч строк я вместил с десяток отдельных больших классов, каждый из которых не более 3-4 тысяч строк. Легко разбить на десяток файлов поменьше.

Про разбитие файлов все понятно, когда ты автор, а когда ты открываешь чужой код, например https://www.sqlite.org/2026/sqlite-amalgamation-3510200.zip где sqlite.c это файл на 265000 строчек, то ну ты хочешь его прочитать.

masa ★★★
()
Последнее исправление: masa (всего исправлений: 1)
Ответ на: комментарий от masa

Читается, к слову, с подсветкой секунд этак за 6. А вот автодополнения уже нету. Я так понимаю - полный парсинг происходит.

LightDiver ★★★★★
()
Ответ на: комментарий от LightDiver

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

masa ★★★
()
Ответ на: комментарий от LightDiver

Согласен. У тому же все что больше пары мегабайт это скорее всего данные, а не код. Зачем тогда его подсвечивать?

cobold ★★★★★
()
Ответ на: комментарий от LightDiver

Я где-то агитировал за какой-то конкретный вариант? Я как раз спрашиваю какой лучше. Вот редактору подсунули огромный файл, что ему дальше делать? Ты за вариант выдать окно с надписью «юзер ты идиот, я редактор кода, не суй в меня свои гигабайты»? Думаю, юзеры такое не оценят.

firkax ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

6мбайт это фигня (на современном железе), там достаточно просто движок подсветки не на джаваскрипте делать и всё будет летать. Подсунь ему 10гбайт, там уже можно смотреть на результат.

firkax ★★★★★
() автор топика
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от firkax

Ненене, я просто задачу не сразу понял. Занятное. Лично я бы выбрал полный парсинг файла, даже если бы это заняло время, но если бы были несколько вариантов - даже лучше, чего нет то.

LightDiver ★★★★★
()
Ответ на: комментарий от masa

На слабом ноуте: mcedit прыгает в конец за 5 секунд (с выключенной подсветкой - примерно за 2), gcc компилирует за 15 секунд (речь про 9мбайтный файл).

Но mcedit кажется не образец скорости, можно и быстрее в разы думаю.

firkax ★★★★★
() автор топика

Единственное практическое применение, которое я могу придумать - всякие CSV и JSON с выгрузкой крупного датасета. И костыли, соответственно, придумывать специально под эти форматы, благо они простенькие.

Файлов КОДА на 10 ГБ не существует в природе.

Один из вариантов поставки исходных кодов sqlite представляет собой все исходники скленные в один файл для упрощения компиляции. Он весит 8 МБ. А это целая СУБД. Можно ориентироваться на десятки мегабайт, больше исходников не будет (в одном файле). Большие кодовые базы состоят из множества файлов и даже модулей собираемых независимо, потому что любой компилятор упадет с out of memory при попытке просто распарсить текст в AST, если ему дать 10 гб исходников.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 3)
Ответ на: комментарий от firkax

У логов каждая строчка независимо красится. И да, ты не поверишь, но для обработки файлов в 10 гб пишут спецсофт, заточенный именно на конкретный формат содержимого.

Так же как, например, на карьере работают специальные огромные карьерные экскаваторы ни на что больше не годные кроме как работать на карьере, а не какие-то особо удачные модели обычных.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Это не мешает емаксу быть как пинцетом, так и эксковатором, при должной настройке, а вот говно джетбрейновскому софту мешает

masa ★★★
()
Последнее исправление: masa (всего исправлений: 1)
Ответ на: комментарий от KivApple

Есть некоторое различие в словах софтваре и хардваре, твой пример из мира хардваре

masa ★★★
()

4,5 самый адекватный, 3 тоже приемлемый. 6 — очень плохой вариант, раздражающий юзера. Хотя в целом иметь выбор хорошо — но это должна быть какая-нибудь настройка в конфиге и включение желаемого режима аргументов командной строки при запуске. Всплывающее окошко каждый раз — лишний раздражитель.

Вариант 1 — это главный редфлаг, после которого нормальный пользователь должен отправить такой редактор в мусорку.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Файл кода на 10 гб? А зачем? Ну чисто теоретически.

Данные в JSON, например.

А для кода проблемы начинаются на сотнях килобайт :) HTML с JavaScript, например.

question4 ★★★★★
()

1 — Самый неудобный, имхо. Будет раздражающе лагать даже на небольших файлах.
2 — Самый разумный компромисс, не требующий вмешательства пользователя.
3 — см. п.5.
4 — Так делает Vim на длинных строках (тысячи знаков). Проверенное временем решение?
5 — Черновую подсветку по последним скольки-то килобайтам наблюдаю постоянно в mcedit. Если есть кавычки, с вероятностью 50% подсветка неверна :) Имхо, легче вообще без неё.
6 — Попап не должен мешать ни фоновому парсингу, ни работе с нераспаршенным файлом. Нужен чекбокс «больше не спрашивать». И наверное, стоит дать возможность устанавливать пороги (размера или времени) для выбора метода. Например, до 0,1 с — заставлять ждать, 0,1-60 с — в фоне, с выбором неточная/никакая, больше 60 с — не парсить.

Лично мне удобнее вариант 2 с возможностью задания порогов в настройках, без попапов.

question4 ★★★★★
()
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

0.1с? Это сколько ж ты собрался изучать файл без подсветки или с кривой, что тебе жаль подождать 0.1-5с?

Вот я сейчас засек. Тот пример сишный выше на 9мб и 266 тысяч строк грузится у меня 1 секунду. Какой смысл мне грузить подсветку частично? Чтобы усложнить себе изучение?

А у меня ноут в режиме крайней экономии с урезанными частотами.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от KivApple

Файлов КОДА на 10 ГБ не существует в природе

ПОКА не существует. Господа вайбкодеры уже работают над этим.

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Когда они будут существовать (если) - будет совсем другое железо и технологии обработки.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)

Не поддерживать подсветку того, что потенциально требует парсинга половины файла. Мне, к примеру, достаточно подсветки ключевых слов, всё остальное - ненужное баловство.

vbr ★★★★★
()

Вариант 4,5 - юзер должен понимать, что если файл большой, то есть ограничения на фичи.

ox55ff ★★★★★
()
Ответ на: комментарий от LightDiver

Файл кода на 10 гб? А зачем? Ну чисто теоретически.
Это что то на сишном?

Обычная сишная портянка с переизобретением всех структур данных и алгоритмов, кое встречается в каждой первой программе.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

А почему не разбить по задачам? Ну чисто для удобства разработки. Есть же ООП (как подход). Есть модульность. Самому же проще работать потом с одним отдельным завершенным в себе логическим кусочком.

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 1)

В vim 4,5, но есть специальные опции, чтобы парсить с разных мест.

unDEFER ★★★★★
()

Программы столько не весят. Значит если не текст программы то можешь резать в любом месте. Режь и парси.

jura12 ★★★
()

Это что за файло такое - аж в 10 Гб?

sparkie ★★★★★
()
Ответ на: комментарий от jura12

если не текст программы то можешь резать в любом месте.

Если там данные в JSON одной строкой, с высокой вероятностью разрежешь стринг, и кавычки распарсятся неправильно :)

question4 ★★★★★
()
Ответ на: комментарий от question4

Ну надо конечно ориентироваться немного. Реагировать по расширению.

jura12 ★★★
()
Ответ на: комментарий от LightDiver

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

Да и компилировать тоже, в общем-то, нежелательно.

knovich ★★
()

А для чего это всё? Для ещё одного ненаписанного Проэкта?

dataman ★★★★★
()

Все 10 гигабайт при первом открытии читать не нужно, достаточно прочитать для вывода первых нескольких страниц, остальное в фоне.

«Конец» лучше всего сделать прогрессивным, т.е. концом должен являться уже прочитанный участок кода, а не 10-й гигабайт.

Парсинг, если только он сделан правильно, а не регуляркой - много процессорного времени не займет. Задача подсветки - всего лишь поменять строку printf("Hello World\n"); на <color=blue>printf</color>(<color=green>"Hello World\n"</color>);

Соответственно парсеру не нужно читать весь блок для его подсветки. Увидел /* - установил <color=gray>. Увидел */ - закрыл </color>.

Насчет необходимости выводить сразу все 10 гигабайт, отдавая это на откуп готовому виджету (gtk_scrolled_window_new в случае GTK) - не уверен. Мне кажется логичнее эмулировать это самому, и выводить на экран только тот текст что на нем умещается, плюс пару страниц выше\ниже для плавности прокрутки.

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

windows10 ★★★★★
()
Последнее исправление: windows10 (всего исправлений: 1)

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

IvanRia
()
Ответ на: комментарий от firkax

Например, логи какие-нить

Угу. Гигабайтный лог в XML - это, к сожалению, не такая уж и фантастика.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от Nervous

Оно не скомпилится физически. Навайбкодить можно 10 ГБ исходников, но они будут в разных файлах. ИИ вполне способен делить исходники на файлы. А даже если он забудет, то он способен понять ошибку компилятора и таки поделить.

Все компиляторы сложнее Ассемблера строят AST, AST занимает в ОЗУ больше, чем исходный код (из-за всяких метаданных, ссылок и т. д.). Часто в разы больше. 10 ГБ исходник создаст в ОЗУ десятки и даже сотни гигабайт AST, компилятор словит OOM.

А ещё у LLM ограниченная длина контекста. Даже топовые нейронки имеют максимум 1 миллион токенов контекстного окна. Туда влезет в лучшем случае несколько мегабайт исходного текста.

Увеличение контекста на 3 порядка весьма маловероятно.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 2)
Ответ на: комментарий от KivApple

Все компиляторы сложнее Ассемблера строят AST,

Вообще-то не все, и тот же Си можно компилировать и без него. Но gcc и другие популярные реализации, вероятно, строят.

firkax ★★★★★
() автор топика

В нормальных языках нечего подсвечивать. Ты же не подсвечиваешь подлежащие и сказуемые в русском. Или подсвечиваешь..?

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

Норма - штука весьма растяжима. Когда то, например, не писали гласные - ведь и так все понятно, врн? Птм гсн стл пст.

Кое где и сейчас не пишут в качестве нормы. А кое где всегда пишут ударения над словами.

¡¿Cómo estás, José? ¡Qué alegría verte!

Да еще и вопросительный восклицательный с обоих сторон фразы.

Просто естественные языки развивались «естественным» путем - далеко не всегда оптимальным. А программистские всегда должны были быть точными. И там сразу можно было сделать более понятно. И делают. Многим естественным этого не хватает для обучения, например.

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

LightDiver ★★★★★
()
Последнее исправление: LightDiver (всего исправлений: 2)
Ответ на: комментарий от LightDiver

А кое где всегда пишут ударения над словами.

¡¿Cómo estás, José? ¡Qué alegría verte!

Эти знаки в испанском не всегда совпадают с ударениями. Даже в этой фразе 1 слово из 6 без них, а чаще — ближе к половине.

question4 ★★★★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)