powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вторничная веревка для Льва Николаича
22 сообщений из 22, страница 1 из 1
Вторничная веревка для Льва Николаича
    #39501574
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет друзья.

Илья. Белый Сов. Дима-Т. Зяма. Вася. Саша Планетарный. Руслан. Жук-ботан и другие мемберы.

Несколько топиков назад мы обсуждали конкатенации строк и прочее ( конкатенация строки в одну переменную ).
И в топике была упомянута такая структура данных как rope (веревка) https://en.wikipedia.org/wiki/Rope_(data_structure)

Структура экзотична и КМК мало где применяется. И у меня возникла мысль - найти ей применение.
Попробовать поработать с крупным текстом и сравнить с обычными строковыми сущностями которые юзаем каждый день.
За примером решил далеко не ходить и взять Войну и Мир одного печально известного бородача.
Почему именно это? Ну... ее легко скачать. http://az.lib.ru/t/tolstoj_lew_nikolaewich/
И весь роман можно оптимально уложить в "Rope" для дальнейших экспериментов.

Далее. Как всегда - бенчмарк. Нам нужна реализация Rope. И собственно задание
применимо к текстовому файлу Войны и Мира.

1. I/O. Загрузка . Собсно надо загрузить текст в эту структуру и померять скорость (символов/сек).
2. Расчеты . Посчитать количество слов. И среднюю длину слова. Посчитать количество уникальных слов.
3. Трансформации . Здесь нам интересно заменить все немецкие и французские и прочие иностранные слова
на русские. (Иду на хитрость и считаю что dictionary уже у нас есть). Ну и время соотв. посчитать.
4. Транспортные расходы и КПД. . Здесь надо посчитать как дорого нам обходится веревка. В сравнении с тем
если-бы мы весь роман хранили в одной строке TString, CString, std::string ... varchar. e.t.c.
5. Поисковые возможности. . Нужно уметь находить нужное слово. И при этом возвращать номер строки и позицию.

Рад буду слышать ваши мысли и замечания.

P.S. Вопросы всяких там html и кодировок я оставляю за кадром.
Они не особо интересны в данном топике и я надеюсь что они не станут
блокером в нашем обсуждении.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501589
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так там же, в Википедии уже есть сравнение с обычными строками.
Что ты хочешь добавить к этой табличке?
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501591
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любопытно, любопытно.

У меня уточняющий вопрос. Строки (которые не Rope) бывают разные: изменяемые, иммутабельные (.net, java), cow. Какую брать за эталон?


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

Тут ещё следует учесть, что объекты более 85 кб попадают в LOH (large object heap), следовательно, в старом стрингбилдере большие строки туда и попадали (что не есть хорошо), в новом они будут храниться кусками в куче маленьких объектов. Вот. SOH компактируется, что хорошо для устранения фрагментации и экономного расходования памяти. LOH раньше не компактировался, но с версии .net 4.5 его тоже можно сжимать. Хорошо бы и это учесть в тестах.

Мда, в итоге выходит куча вариантов. Чё-то я очкую... Но я всегда готов дать ЦУ.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501605
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку алгоритм Rope не выставляет требований к самим строкам - то берите
какой удобно.

Я вот еще забыл упомянуть по какому принципу резать текстовый файл:
- по словам
- по строкам ограниченным переводом строки

Первый вариант удобен тем что даёт статистику узлов (nodes) веревки близкую
к словам и удобен для текстового поиска.

Второй вариант более экономный с точки зрения узлов. И строки более крупные.
не будем мельчить на всяких там междометиях и предлогах.

Вообще надо всё-таки ввести в алгоритм параметр:
- минимальная длина строки в node
- стратегия балансировки (тут надо подумать).
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501611
Pu4koff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И без бенчмарков по самому принципу построения Rope-строк понятно, что выигрыш может быть только на вставке строки в середину и удалении кусков строки. Тут нужно искать задачу, в которой Rope-строки действительно нужны и дадут преимущество. Я такой задачи не знаю. StringBuilder решает все проблемы со строками, которые мне встречались и по производительности в обычных вариантах использования (добавление строки в конец) заведомо уделает Rope-строки.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501613
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перевод с иностранных языков.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501626
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvikИнформация к размышлению (в первую очередь - для себя самого):
В дотнете первых версий StringBuilder был реализован как изменяемая строка, а начиная с версии 4.0 он как раз является реализацией верёвки. Так что если кто из дотнетчиков возьмётся, то было бы здорово обе версии померить.
Исходники StringBuilder
Нет там никакой веревки, там связный список из массивов
Код: c#
1.
2.
        internal char[] m_ChunkChars;                // The characters in this block
        internal StringBuilder m_ChunkPrevious;      // Link to the block logically before this block
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501637
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСтруктура экзотична и КМК мало где применяется. И у меня возникла мысль - найти ей применение.
Работа с большими текстами редкая задача, как следствие инструменты под нее тоже.

По-большому счету сюда отлично подходят алгоритмы управления хранением данных в РСУБД. По сути там та же веревка из страниц, записей и т.д.

Можно попробовать залить в БД какую-нибудь. SQLite тут вполне подойдет. Там in-memory DB есть.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501641
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выше по ссылкам я предлагал не реализацию стринг билдера а ленивый алгоритм конкатенации
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39501659
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВыше по ссылкам я предлагал не реализацию стринг билдера а ленивый алгоритм конкатенации
Поизучал вики про rope. Он заточен под вставить/вырезать в любое место, эти операции быстрее будут. Общий размер быстро вычисляется. Но под поиск никак не заточено, т.е. точно также перебор как при других способах хранения. Перебор будет медленнее, по сравнению вариантами хранения одним большим массивом.

ИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502161
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоскольку алгоритм Rope не выставляет требований к самим строкам - то берите
какой удобно.
вторая же фраза в Вашей ссылки в Википедии

For example, a text editing program may use a rope to represent the text being edited, so that operations such as insertion, deletion, and random access can be done efficiently.

нафига козе баян, если String immutable и никакой radom access, а тем более "insertion, deletion" не нужен

mayton1. I/O. Загрузка....
2. Расчеты....
4. Транспортные расходы и КПД....
5. Поисковые возможности..

нафига козе баян?

mayton3. Трансформации. Здесь нам интересно заменить все немецкие и французские и прочие иностранные слова
на русские. (Иду на хитрость и считаю что dictionary уже у нас есть). Ну и время соотв. посчитать.

Смотря через какое место делать
Если сделать все в один проход, обычных строк вполне хватит
Если сделать все через ж....пу, то одной веревки мало, нужно еще и мыло
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502164
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T
Ко всему плюсуюсь

Dima TРабота с большими текстами редкая задача, как следствие инструменты под нее тоже.

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

Ну, кроме г...но кода (в том или другом виде), где вся обработка построена на instr, substrt и десятках и сотнях if. Такое встречается часто. Другое дело, что слава богу, там речи про "большие тексты" обычно не идет.

И, слава богу, там нет никаких веревок.

Поэтому, когда начинает тормозить, то сейчас к программисту применяют не веревку и мыла, а обычный вазелин. А это более гуманная технология ))) (по сравнению с веревкой)
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502167
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsevнафига козе баян?
Мне очень приятно что вы как и я - большой любитель фольклора. Пословиц.. поговорок и прочее.
И мы с вами можем часами перебрасываться шутками-прибаутками и прочими частушками.

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

Уж поверьте на проектах этого полно да и тошнит от прагматизма коллег...

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

Ну... смотрите. О каких проходах идет речь? Откуда текстовый редактор знает
что пользователь собирается делать с текстом?

Я понимаю что мой поток мозгового сознания часто шокирует читателя и ввергает
его в изумление. Но я надеюсь что вы поймете мой интерес.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502171
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОбщий размер быстро вычисляется.
Нет. Общий размер не вычисляется. Он - платформозависим. Есть просто некая грубая
оценка, основанная опять-же на эксперименте. Загрузили 5 мегабайт Войны и Мира
и спрогнозировали прирост на все сочинения Джека Лондона e.t.c.

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

Плохие алгоритмы поиска - просто брутфорсят массив. Нам они - не интересы.

ИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит.
Неверно. Стринг билдер никак не является основой для тестовых редакторов.

В крайнем случае linked-list из строк или более сложная структура но никак не стринг-билдер.

И вообще в контексте обсуждения Rope, я считаю StringBuilder если не контр-примером
то по крайней мере неким антогонизмом или мёртвой формой Rope. Впрочем я готов
признать что он будет нужен но буду настаивать на замене его на Stream<Char>
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502185
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima TОбщий размер быстро вычисляется.
Нет. Общий размер не вычисляется.
Я картинку в вики смотрел, там в корне дерева размер. Да и для доступа по индексу элемента он нужен. Так что быстро, т.е. быстрее получения размера строки с нулем на конце.

maytonПлохие алгоритмы поиска - просто брутфорсят массив. Нам они - не интересы.
Война и мир 1 Мб на том. Я брутофорсю в памяти на неточное совпадение (Левенштейн) до 50 Мб и тормозов не наблюдается даже на замшелых селеронах.

maytonDima TИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит.
Неверно. Стринг билдер никак не является основой для тестовых редакторов.
Согласен. Я совсем другое утверждал.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502188
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЯ картинку в вики смотрел, там в корне дерева размер. Да и для доступа по индексу элемента он нужен. Так что быстро, т.е. быстрее получения размера строки с нулем на конце.

Дим! Я имел в виду не размер строки. Я и так его знаю из текстового файла.

Я имею в виду размер структуры данных "Rope".
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502197
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ имею в виду размер структуры данных "Rope".
Это пофиг. Как выше написал: Война и мир 1 Мб на том. Пусть даже 3 Мб уйдет на доп.инфу. В кэш проца один том влезет легко, про гигабайты РАМ - молчу. Текст это не та инфа, которая требует внимания к занимаемой памяти.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502199
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот. У нас уже есть оценка. В 300% от исходного размера строки.

Хотя я-бы ввел искусственный регулятор. Я-бы просто задал 150% как коэффициент
загруженности и склеивал бы соседние nodes до тех пор пока это соотношение
не было бы достигнуто. Мдя.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502200
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу вот. У нас уже есть оценка. В 300% от исходного размера строки.
Я с запасом написал. Чтобы если ошибиться, то в большую сторону. Т.е. оценка: максимум +300%
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502215
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну дай бох. Только не забывай что деревья иногда имеют чудовищный оверхед (10, 100, 1000 крат)
на листовых вершинах. Даже при том что листья не несут полезной нагрузки а просто созданы
как заглушки для NULL-s.
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502470
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... смотрите. О каких проходах идет речь? Откуда текстовый редактор знает
что пользователь собирается делать с текстом?
Если интерактивный текстовый редактор - то да

Но если говорить об универсальной замене String на что-то сложное... то нужно ли?

mayton3. Трансформации. Здесь нам интересно заменить все немецкие и французские и прочие иностранные слова
на русские. (Иду на хитрость и считаю что dictionary уже у нас есть). Ну и время соотв. посчитать.


Считали символ/токен, обработали, записали в выходной поток. InputStream, String, OutputStream

текст - парсинг - структура близкая к предметной области (а не текст!) - обработка - сборка результате - текст

А желание "быстро" выполнять операции instr, substr, cancat... над большим тестом... крайне странное. Хотя и очень часто встречается в реальном коде (((


Когда в конце 90-х изобретал свой "полнотекстовый" поиск, просто побил текст по словам, загнал в БД таблички:

запись о предмете - N:N связка - справочник слов
и искал SELECT'ами + INTERSECT + последующий фильтр и подсветка найденных подстрок

на P III RAM 16 Mb (возможно на сервере 64 Mb было) вполне нормально работало
(от 0.1 до 2 секунды запрос, до 8-16 одновременных запросов спокойно выдерживало, если больше - PostgreSQL по памяти падал. Apache, Servlets, Java, PostgreSQL )

http://iss.rybmuseum.ru/items?query=Веревка&filter-by=images
как сейчас сделано - не знаю ))), но думаю, особо никто не менял. В мое время работало значительно быстрее, но полупрозрачных окошек не было )))
...
Рейтинг: 0 / 0
Вторничная веревка для Льва Николаича
    #39502548
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonНу вот. У нас уже есть оценка. В 300% от исходного размера строки.
Я с запасом написал. Чтобы если ошибиться, то в большую сторону. Т.е. оценка: максимум +300%
ну кроме overhead по памяти, будет еще и overhead по производительности

как overhead чисто по CPU, кэшу (например последовательный просмотр текста будет уже ни такой "последовательный"), так и для языков типа Java, overhead по кол-ву объектов/мусора в Heap'е. О последнем как-то забывают. Сначала наплодят мусора выше крыши, а потом жалуются, что Java тормозная. IMHO & AFAIK

замерить влияние - фиг замеришь, а на реальном проекте в продакшене можно потом долго с performance бороться. IMHO & AFAIK
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Вторничная веревка для Льва Николаича
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]