Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Привет друзья. Илья. Белый Сов. Дима-Т. Зяма. Вася. Саша Планетарный. Руслан. Жук-ботан и другие мемберы. Несколько топиков назад мы обсуждали конкатенации строк и прочее ( конкатенация строки в одну переменную ). И в топике была упомянута такая структура данных как 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 и кодировок я оставляю за кадром. Они не особо интересны в данном топике и я надеюсь что они не станут блокером в нашем обсуждении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.08.2017, 23:19 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Так там же, в Википедии уже есть сравнение с обычными строками. Что ты хочешь добавить к этой табличке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 00:26 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Любопытно, любопытно. У меня уточняющий вопрос. Строки (которые не Rope) бывают разные: изменяемые, иммутабельные (.net, java), cow. Какую брать за эталон? Информация к размышлению (в первую очередь - для себя самого): В дотнете первых версий StringBuilder был реализован как изменяемая строка, а начиная с версии 4.0 он как раз является реализацией верёвки. Так что если кто из дотнетчиков возьмётся, то было бы здорово обе версии померить. Тут ещё следует учесть, что объекты более 85 кб попадают в LOH (large object heap), следовательно, в старом стрингбилдере большие строки туда и попадали (что не есть хорошо), в новом они будут храниться кусками в куче маленьких объектов. Вот. SOH компактируется, что хорошо для устранения фрагментации и экономного расходования памяти. LOH раньше не компактировался, но с версии .net 4.5 его тоже можно сжимать. Хорошо бы и это учесть в тестах. Мда, в итоге выходит куча вариантов. Чё-то я очкую... Но я всегда готов дать ЦУ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 01:48 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Поскольку алгоритм Rope не выставляет требований к самим строкам - то берите какой удобно. Я вот еще забыл упомянуть по какому принципу резать текстовый файл: - по словам - по строкам ограниченным переводом строки Первый вариант удобен тем что даёт статистику узлов (nodes) веревки близкую к словам и удобен для текстового поиска. Второй вариант более экономный с точки зрения узлов. И строки более крупные. не будем мельчить на всяких там междометиях и предлогах. Вообще надо всё-таки ввести в алгоритм параметр: - минимальная длина строки в node - стратегия балансировки (тут надо подумать). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 07:40 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
И без бенчмарков по самому принципу построения Rope-строк понятно, что выигрыш может быть только на вставке строки в середину и удалении кусков строки. Тут нужно искать задачу, в которой Rope-строки действительно нужны и дадут преимущество. Я такой задачи не знаю. StringBuilder решает все проблемы со строками, которые мне встречались и по производительности в обычных вариантах использования (добавление строки в конец) заведомо уделает Rope-строки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 08:16 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Перевод с иностранных языков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 08:25 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
petalvikИнформация к размышлению (в первую очередь - для себя самого): В дотнете первых версий StringBuilder был реализован как изменяемая строка, а начиная с версии 4.0 он как раз является реализацией верёвки. Так что если кто из дотнетчиков возьмётся, то было бы здорово обе версии померить. Исходники StringBuilder Нет там никакой веревки, там связный список из массивов Код: c# 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 08:56 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
maytonСтруктура экзотична и КМК мало где применяется. И у меня возникла мысль - найти ей применение. Работа с большими текстами редкая задача, как следствие инструменты под нее тоже. По-большому счету сюда отлично подходят алгоритмы управления хранением данных в РСУБД. По сути там та же веревка из страниц, записей и т.д. Можно попробовать залить в БД какую-нибудь. SQLite тут вполне подойдет. Там in-memory DB есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 09:16 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Выше по ссылкам я предлагал не реализацию стринг билдера а ленивый алгоритм конкатенации ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 09:26 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
maytonВыше по ссылкам я предлагал не реализацию стринг билдера а ленивый алгоритм конкатенации Поизучал вики про rope. Он заточен под вставить/вырезать в любое место, эти операции быстрее будут. Общий размер быстро вычисляется. Но под поиск никак не заточено, т.е. точно также перебор как при других способах хранения. Перебор будет медленнее, по сравнению вариантами хранения одним большим массивом. ИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 10:16 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
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 уже у нас есть). Ну и время соотв. посчитать. Смотря через какое место делать Если сделать все в один проход, обычных строк вполне хватит Если сделать все через ж....пу, то одной веревки мало, нужно еще и мыло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:02 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Dima T Ко всему плюсуюсь Dima TРабота с большими текстами редкая задача, как следствие инструменты под нее тоже. работа с большими текстами - частая задача но вот online работа с большими текстами - кроме текстовых редакторов, сложно себе представить, где еще требуется. Ну, кроме г...но кода (в том или другом виде), где вся обработка построена на instr, substrt и десятках и сотнях if. Такое встречается часто. Другое дело, что слава богу, там речи про "большие тексты" обычно не идет. И, слава богу, там нет никаких веревок. Поэтому, когда начинает тормозить, то сейчас к программисту применяют не веревку и мыла, а обычный вазелин. А это более гуманная технология ))) (по сравнению с веревкой) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:09 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Leonid Kudryavtsevнафига козе баян? Мне очень приятно что вы как и я - большой любитель фольклора. Пословиц.. поговорок и прочее. И мы с вами можем часами перебрасываться шутками-прибаутками и прочими частушками. Но поскольку форум у нас - технический то я ограничусь тем что скажу что я иногда люблю "пошатать вселенскую энтропию". И о каких-то там профитах или монетизациях я в этот момент не думаю. Просто мне нравится сам процесс. Уж поверьте на проектах этого полно да и тошнит от прагматизма коллег... Смотря через какое место делать Если сделать все в один проход, обычных строк вполне хватит Если сделать все через ж....пу, то одной веревки мало, нужно еще и мыло Ну... смотрите. О каких проходах идет речь? Откуда текстовый редактор знает что пользователь собирается делать с текстом? Я понимаю что мой поток мозгового сознания часто шокирует читателя и ввергает его в изумление. Но я надеюсь что вы поймете мой интерес. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:19 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Dima TОбщий размер быстро вычисляется. Нет. Общий размер не вычисляется. Он - платформозависим. Есть просто некая грубая оценка, основанная опять-же на эксперименте. Загрузили 5 мегабайт Войны и Мира и спрогнозировали прирост на все сочинения Джека Лондона e.t.c. Но под поиск никак не заточено, т.е. точно также перебор как при других способах хранения. Перебор будет медленнее, по сравнению вариантами хранения одним большим массивом. Напомню что хорошие алгоритмы поиска основаны на предварительной индексации искомого пространства. И исходят из предположения что мы ищем не кусок рандомного блоба а вполне себе законченные лексические и синтаксические конструкции. Слова. Предлоги. Предложения. Плохие алгоритмы поиска - просто брутфорсят массив. Нам они - не интересы. ИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит. Неверно. Стринг билдер никак не является основой для тестовых редакторов. В крайнем случае linked-list из строк или более сложная структура но никак не стринг-билдер. И вообще в контексте обсуждения Rope, я считаю StringBuilder если не контр-примером то по крайней мере неким антогонизмом или мёртвой формой Rope. Впрочем я готов признать что он будет нужен но буду настаивать на замене его на Stream<Char> ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:29 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
maytonDima TОбщий размер быстро вычисляется. Нет. Общий размер не вычисляется. Я картинку в вики смотрел, там в корне дерева размер. Да и для доступа по индексу элемента он нужен. Так что быстро, т.е. быстрее получения размера строки с нулем на конце. maytonПлохие алгоритмы поиска - просто брутфорсят массив. Нам они - не интересы. Война и мир 1 Мб на том. Я брутофорсю в памяти на неточное совпадение (Левенштейн) до 50 Мб и тормозов не наблюдается даже на замшелых селеронах. maytonDima TИМХО Для текстовых редакторов разве что подойдет такая структура. Обычно надо просто объединить несколько строк "ааа" + "ббб" + "ввв" ... Для таких операций структура стринг билдера лучше подходит. Неверно. Стринг билдер никак не является основой для тестовых редакторов. Согласен. Я совсем другое утверждал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:53 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Dima TЯ картинку в вики смотрел, там в корне дерева размер. Да и для доступа по индексу элемента он нужен. Так что быстро, т.е. быстрее получения размера строки с нулем на конце. Дим! Я имел в виду не размер строки. Я и так его знаю из текстового файла. Я имею в виду размер структуры данных "Rope". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 21:59 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
maytonЯ имею в виду размер структуры данных "Rope". Это пофиг. Как выше написал: Война и мир 1 Мб на том. Пусть даже 3 Мб уйдет на доп.инфу. В кэш проца один том влезет легко, про гигабайты РАМ - молчу. Текст это не та инфа, которая требует внимания к занимаемой памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 22:10 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Ну вот. У нас уже есть оценка. В 300% от исходного размера строки. Хотя я-бы ввел искусственный регулятор. Я-бы просто задал 150% как коэффициент загруженности и склеивал бы соседние nodes до тех пор пока это соотношение не было бы достигнуто. Мдя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 22:13 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
maytonНу вот. У нас уже есть оценка. В 300% от исходного размера строки. Я с запасом написал. Чтобы если ошибиться, то в большую сторону. Т.е. оценка: максимум +300% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 22:17 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Ну дай бох. Только не забывай что деревья иногда имеют чудовищный оверхед (10, 100, 1000 крат) на листовых вершинах. Даже при том что листья не несут полезной нагрузки а просто созданы как заглушки для NULL-s. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.08.2017, 22:51 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
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 как сейчас сделано - не знаю ))), но думаю, особо никто не менял. В мое время работало значительно быстрее, но полупрозрачных окошек не было ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 12:13 |
|
||
|
Вторничная веревка для Льва Николаича
|
|||
|---|---|---|---|
|
#18+
Dima TmaytonНу вот. У нас уже есть оценка. В 300% от исходного размера строки. Я с запасом написал. Чтобы если ошибиться, то в большую сторону. Т.е. оценка: максимум +300% ну кроме overhead по памяти, будет еще и overhead по производительности как overhead чисто по CPU, кэшу (например последовательный просмотр текста будет уже ни такой "последовательный"), так и для языков типа Java, overhead по кол-ву объектов/мусора в Heap'е. О последнем как-то забывают. Сначала наплодят мусора выше крыши, а потом жалуются, что Java тормозная. IMHO & AFAIK замерить влияние - фиг замеришь, а на реальном проекте в продакшене можно потом долго с performance бороться. IMHO & AFAIK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.08.2017, 13:33 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39501605&tid=1340313]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 16ms |
| total: | 274ms |

| 0 / 0 |
