powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Юникод и utf8
25 сообщений из 172, страница 4 из 7
Юникод и utf8
    #39708883
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene New- невозможность доступа по индексу

Доступ к элементу по индексу - это частный случай. Я-бы обобщил до операций

Код: java
1.
substr(m,n)



Это - универсал. Пуля из серебра. Если мы докажем ее средне-статистическую эффективность для
строк с плавающей кодировкой типа utf-8 то все conserns должны отпасть сами по себе.

Расмотрим кейс миграции с win-1251 на utf-8 и эту волшебную функцию и потери на памяти.

Поинты:

1) В средне-статистическом приложении строки обычно не очень длинные.

Коллеги кто можеть оценить (сделать мемори дамп) для С++ приложения и сказать сколько там длины.
Среднее. Максимум. Если гистограмма - вообще замечательно.

Могу предположить что если львиная доля строк - короткие 0,1,2,3 символа то время отклика
алгоритма подстроки будет практически без изменений. Это как сортировка пузырьком.
Для массивов 2-3 элемента работает быстрее всех хоаров.


Я могу (теоретически) сделать дамп для Java но это какраз не наш кейс. Java не будет мигрировать строки на utf-8.
У нее другой подход (я приводил сорцы).

Кстати это тоже хороший вопрос. Многие мысли об оптимизации строкового API основываются
на наших рафинированных предположениях о том что ОНО ТАК РАБОТАЕТ. А может быть оно работает так... но
редко. Ну настолько редко что... йошкин крот зачем мы вообще этим занялись. Вобщем до оптимизации
кроме метрик комплексити (с которыми я не спорю) есть еще некий здравый смысл о частоте применения.


2) Пример парсинга URL - хороший. Но где там индексный доступ? Если мы применяем регулярку
то автомат разбора который будет сгенерирован регуляркой обычно применяется к исходной строке
поточно. Слева направо как и работают все синтаксические машины. Следовательно индексный доступ
к произвольному элементу - не важен. Если есть итератор char * который стоит и смотрит на первый
символ то его достаточно чтоб решить данную задачу.

Если мы детектируем протокол (хедер строки) то вызов substr(m,n) вырождается до substr(0,n).

Код: sql
1.
^(?<protocol>http(s)?).*



Код: java
1.
2.
3.
if ("https://sql.ru/".substr(0,4) == "http") {
   ....
} else { ... }



Кто не согласен что достаточно - оппонируйте.

3) Перформанс случаев применения substr(m,n) к utf-8 содержимому баз данных .
Не окажут какого либо сильного воздействия на перформанс. Основная нагрузка будет идти на I/O и на физическое
вычитывание блоков сегмента таблиц. Я вангую что нагрузка на CPU может поднятся в диапазоне
от 0 до 50%. А время отклика - практически не изменится. Тоесть ожидали вы отчот 1 минуту с win1251
и после миграции колонки на utf-8 так-же будете ждать минуту.

4) Проигрыш памяти БД. Здесь для баз данных в целом пофиг. Это экспертно . Я просто давлю на то
что содержимое строк не покрывает сегмент данных на 100%. Есть другие типы и прочее.
Кроме того средняя БД практически никак не реагирует на изменение длины данных в строках.
Много дыр в сегменте данных. Много технических гистерезисов которые так просто в двух
словах не объяснить. В целом - не реагирует. Конечно 90% зависит от того как грамотно
вы провели конвертацию. Что делали после drop column и прочее. Характеристики блоков сегмента...

5) Проигрыш оперативной памяти для приложений . Здесь тоже нужна статистика. Нужно посчитать % соотношение Latin
и кириллицы и взять нечто взвешенное. Это тоже дополнение к пункту (1)

Я вангую что если у вас было С++ приложение работающее с win-1251 и вы его адаптировали
к utf-8 то особого проигрыша памяти не будет.

6) Некий гипотетический worst-case. Мы будем искать суффикс.
Код: plaintext
1.
s.substr(m, s.length)


Ну... где это может быть полезно? Я не знаю. Младшие разряды. В телефонном номере 5 или 7 последних цифр.
Не знаю. Тут надо архитектурно подумать. Может хранить телефон в реверсивном формате. Может разделить
мобильный оператор и номерную ёмкость в отдельные поля БД и в бизнес-сущностях.

Вобщем зубодробилка существует. Но ее надо обсуждать.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708895
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby, только начал смотреть. Сразу возник вопрос. Эдакий машинальный code-review point который меня блочит.
Код: plsql
1.
2.
3.
  Function buff_by_stacker( pc_char in T_CHAR       -- этим символом заполнить буфер
                           , pc_stacker IN OUT NOCOPY T_MAXSTRING -- это объект-приёмник, он не должен измениться по завершении процедуры, таков контракт
                          ) Return T_MAXSTRING



Почему pc_stacker объявлен как OUT ?
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708899
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы22) Посмотрите уже, наконец, что не 66 букв надо на кириллицу. Там за сотню точно уйдет.
3) Навскидку, не менее 40 (и этим пользуются).

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

В принципе сошла-бы верхняя граница. Например - не более 150. Или не более 200.

По третьему - спс.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708902
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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

способ оформления - функция или процедура, в данном случае это сахар с запахами, к делу не относится.
но в той искусственной "учебной" истории изначально говорилось о функции,
потому так и пересказываю.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708920
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobymayton,

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

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

Мне не очень понятен вход и выход.

Я так себе вижу. На вход подается

Код: sql
1.
2.
3.
 
c_filler T_CHAR :='x';  
c_input Varchar2(31123) := '123';



На выходе в консоли мы получаем. Хм... а что мы получаем? Непонятно.
Код: sql
1.
"x 123 ????? ?"



Прошу прощения я всегда привых рассматривать задачу с верхнего уровня. С уровня смысла так-сказать.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708932
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobymaytonпропущено...

ОК. Спасибо. Почитаю.
нашел ссылку:
https://www.oracle.com/technetwork/products/globalization/efficient-plsql-133329.pdf
Для AL32-UTF-8 Length посчитан как o(m).

Маху дали. Можно было добавить свойство длины и получить константу. Это привело-бы
к небольшому увеличению структуры данных для NVARCHAR на пару байтов. Пожадничали?
На серваках БД по 128 Гиг щас ставят. Мдя...
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708934
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот мысль. Для Евгения. Фантазируй бро.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class QuasiLinearAccessTimeString {

   private final byte[] fuckenUtf8array;
   private final int lengthInChars;

   // Contains mapping between key-character positions (with 0, 15, 31, 47 offsets) and physical offsets;
   private final Map<Integer,Integer> quasiIndexToOffset; 

   private final int step = 16; // Step by 16 characters

   ..........

   public QuasiLinearAccessTimeString(String s) { ... }

   public QuasiLinearAccessTimeString(String s, int anotherFuckenStep) {....}

}
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708935
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton...
Мне непонятно также почему используется LONG. Это морально устаревший тип и его заменяют обычно на BLOB.
...


Ну, мне лень сейчас было писать
SUBTYPE T_MAXSTRING is Varchar2(32767);

а LONG в pl/sql определен как

SUBTYPE LONG is Varchar2(32760);

букв меньше, и уменьшенная на 7 вместимость существа дела здесь не меняет.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708944
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет количества знаков для кириллицы. Очень грубый подсчет дает ~85 графически разных букв, имеющих прописное и строчное написание, и ~5 знаков с единственным вариантом. Итого, не менее 175 штук. Думаю, оценка сверху в 200 знаков даст запас, но не очень большой.

В латинице можно считать ~60 дополнительных знаков к основному набору. То есть примерно те же 200 знаков. Можно заметно сократить, используя комбинируемые диакритические знаки. С кириллицей тоже должно сработать, но все равно в 256 символов не уложиться.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708952
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exp98,
кто в последние десятилетия регулярно побеждает на олимпиадах прогр/мат ?
Потому что используют не иероглифы.

Или к примеру объективно известно, что женщины не пользуются мужской логикой. Тоже отсталые?
Ну если вы так уверены, что это доказано, да еще и объективно, то да. Правда, я лично сомневаюсь в наличии такого доказательства.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708956
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

substr(m,n)

Это другая задача. Более затратная чем s [n]. То есть меняя s [n] на substr(m,n) мы сразу теряем.

Насчет остального - не сомневаюсь, что те, кто проталкивал utf8, подготовили много доводов. Только состоятельны ли они?

В средне-статистическом приложении строки обычно не очень длинные.

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

Проигрыш памяти БД. Здесь для баз данных в целом пофиг. Это экспертно

Не соглашусь. Все наоборот. Исключение - использование только английских символов в UTF8. Уж о себе то они позаботились.

автомат разбора

Усложняется и это частный случай.

средняя БД практически никак не реагирует на изменение длины данных в строках.

Как она может не реагировать, когда вам приходится делать все строковые поля в ДВА раза большего объема. Не писать туда больше, а сразу увеличивать длину полей в байтах в два раза. Раньше надо было 100 байтов, теперь надо 200. Потому что поле может достигать 100 символов длиной на русском языке.
Если вы используете русский язык в базе. Для латиницы, повторяюсь, все равно. Для русского языка - катастрофичное увеличение объема.

Проигрыш оперативной памяти для приложений.
чем больше используют русский язык, тем хуже.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708958
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрите уже, наконец, что не 66 букв надо на кириллицу. Там за сотню точно уйдет

Из этих лишних букв действительно нужно очень мало. В первую очередь надо смотреть на славянские языки. Болгарский алфавит, например, точно такой же, как русский.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708960
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QuasiLinearAccessTimeString

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

Можно выделить на маркер спецсимвола 1 байт (с кодом < 32, из нечитаемых) и на номер кодировки еще 1. И в таком виде хранить сплошняком текст. Его можно будет один раз прочитать и разбить на куски из национально кодированных строк. И он НЕ БУДЕТ занимать в два раза больше места, как занимает любой текст в UTF8 в любой национальной кодировке.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39708963
Eugene New
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строку можно хранит сплошняком и хранить индексы 'переходных' из одной кодировки в другую байтов.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709006
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы2Насчет количества знаков для кириллицы. Очень грубый подсчет дает ~85 графически разных букв, имеющих прописное и строчное написание, и ~5 знаков с единственным вариантом. Итого, не менее 175 штук. Думаю, оценка сверху в 200 знаков даст запас, но не очень большой.

В латинице можно считать ~60 дополнительных знаков к основному набору. То есть примерно те же 200 знаков. Можно заметно сократить, используя комбинируемые диакритические знаки. С кириллицей тоже должно сработать, но все равно в 256 символов не уложиться.
Отлично.

Нам нужно сохранить нижнюю половину таблицы полностью. Тоесть 128 симвлов оставить как есть.
+ 200 знаков для всех киррилических языков мира

Итого 328 знаков.

Укладываемся в 9 битов. (не более 512 состоянии и еще запас есть)

9 и 8 считаем наименьшее общее кратное 9 и 2*2*2 вобщем просто произведение 72 бита.
Тоесть 9 байтов кодируют 8 символов. Формула не очент красивая. Не получилось выровнять
на четные границы адресов. Но зато почти o(1) доступ.

Далее можно попробовать еще вариант с множителями как в base85.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709013
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewКак она может не реагировать, когда вам приходится делать все строковые поля в ДВА раза большего объема. Не писать туда больше, а сразу увеличивать длину полей в байтах в два раза. Раньше надо было 100 байтов, теперь надо 200. Потому что поле может достигать 100 символов длиной на русском языке.
Если вы используете русский язык в базе. Для латиницы, повторяюсь, все равно. Для русского языка - катастрофичное увеличение объема.
Как я уже писал. Сегментное пространство таблиц состоит из смеси VARCHAR, NUMBER, DATE типов и прочих сырых типов и служебной информации и пустого места. Из оставшися VARCHAR типом вы выкинем всякие GUID телефоны адреса электронки и бизнесовые идентификаторы которые пробиты латиницей.

Каждый мой шаг можете отмечать некой примерной оценкой (например брать 1:4). Тоесть на каждый кирилический типа будет 4 латинских. На каждое VARCHAR поле будет 4 не-варчар. Или берите другое соотншение. Пофиг. Важно что деля этот объем
сегмента на порции я вам показываю что на самом деле кириллица не может занимать много места изначально.

(Если у вас не библиотека Мошкова в базе).

Все это мои предположения на основе моего видения СРЕДНЕСТАТИСТИЧЕСКОЙ базы. Торт с названием база я режу на
кусочки и каждый кусочек тоже на кусочки.

Если я ошибся или вы сомневаетесь то давайте мне вашу киррилическую базу и мы погоняем в ней

Код: sql
1.
SELECT sum(length(cyrillic_field1)) FROM TAB1..... e.t.c. для всех полей и оценим объем в символах.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709016
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewЭто другая задача. Более затратная чем s [n]. То есть меняя s [n] на substr(m,n) мы сразу теряем.

Это неважно. Я-же генерализировал ваше требование. Взял тот сет функций который опирается
в на жалкую и ничтожную s[n] которая мало полезна сама по себе. Мало кому нужен 20-й символ.
А вот взять с 0 по 4-й - это нужная задача особенно когда мы парсим протокол URL.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709019
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewДаже если они не длинные, то их много и они занимают много места. Строки обычно всегда оказываются первым узким местом по расходу памяти.
Я писал выше что в средне-статистическом java-приложении сегмент char[] является самым толстым по потреблению.
Но не забывайте что рантайм jvm (classloader) складывает туда толстные названия пакетов + классов. И анонимных классов.
Тоесть масса служебной инфы кроме прикладной. Это только особенность JVM.

Хотя для некоторых приложений int[] иногда выходил наверх.

Для других языков и технологий C++/.Net/Python/ e.t.c. я такой статистики не знаю. И я прошу знатоков
этих технологий дать нам в топик сведенья.

А сколько собственно строк и каков их средний размер?
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709022
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene Newавтомат разбора

Усложняется и это частный случай.

Я не принимаю этот аргумент. Где justification? Документация? Фрагмент кода?
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709025
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewПроигрыш оперативной памяти для приложений.
чем больше используют русский язык, тем хуже.
Это просто прекрасно! Из этого можно сделать вывод что не стоит использовать русский язык.
Будьте осторожны с тезисами. Я - же хочу числовую оценку. А вы просто сообщаете банальность.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709030
Ы2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene NewПреобразуем все в однобайтовую кодировку, номер кодовой страницы храним в одном лишнем байте. Если уж тот редчайший случай, когда одновременно больше 2 языков в документе, разбиваем его на части по языкам.

Можно выделить на маркер спецсимвола 1 байт (с кодом < 32, из нечитаемых) и на номер кодировки еще 1. И в таком виде хранить сплошняком текст. Его можно будет один раз прочитать и разбить на куски из национально кодированных строк.
Поздравляю, вы изобрели Word 2a (был актуален в начале 90-х). Именно от чего-то такого и отказались, когда придумали Unicode. И людей, у которых в документах более двух языков довольно много, больше, чем вам кажется по личному опыту.

А кроме документов есть еще разные системы хранения и обработки текстов, где ваша идея означает существенное увеличение сложности (т.е. потери производительности) ценой некоторого сокращения объема хранимых данных.

Об организационной стороне вашей идеи даже думать не хочется :)
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709041
Фотография OoCc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Eugene Newmayton,
substr(m,n)
Это другая задача. Более затратная чем s [n]. То есть меняя s [n] на substr(m,n) мы сразу теряем.

Вопрос не в substr как таковой а в нахождении m,n

при таком подходе есть разница
Код: sql
1.
^(?<protocol>http(s)?).*



а при таком практически нет
Код: sql
1.
^(((?<protocol>[^:]*):\/\/)?).*
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709042
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonВерно?Да, я уже высказывался на эту тему.
И продолжу высказываться, если сочту нужным:
1. Текст не является массивом символов;
2. Из юникодных кодировок общего назначения должен остаться только UTF8. UTF16/32 - должны сдохнуть.

P.S.
Есть кодировки юникода "специального назначения" - они имеют право на существование в специфичных задачах.

P.P.S.
И да, эти спец.кодировки позволяют упаковать в один байт "много чего".
Поэтому НовоЮджину, надо в школу, чтобы не высказываться в космических масштабах и такой же глупости.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709049
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonНу... где это может быть полезно? Я не знаю. Младшие разряды. В телефонном номере 5 или 7 последних цифр.Я напоминаю, что UTF8 обратно совместима с US-ASCII.
Практически это означает, что целый пласт алгоритмов для US-ASCII переносятся на UTF8 без каких-либо модификаций.
Это и ваш "поиски последних цифр телефонного номера" и "разбиение файлового пути по элементам" и т.д. и т.п.
...
Рейтинг: 0 / 0
Юникод и utf8
    #39709054
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonНу... где это может быть полезно? Я не знаю. Младшие разряды. В телефонном номере 5 или 7 последних цифр.Я напоминаю, что UTF8 обратно совместима с US-ASCII.
Практически это означает, что целый пласт алгоритмов для US-ASCII переносятся на UTF8 без каких-либо модификаций.
Это и ваш "поиски последних цифр телефонного номера" и "разбиение файлового пути по элементам" и т.д. и т.п.
Прошу прощения. Они то совместимы. Но до того как мы начали поиск суффикса в UTF8 - мы не знаем
что внутри строки. Хотя упрощение - справедливое. Да.
...
Рейтинг: 0 / 0
25 сообщений из 172, страница 4 из 7
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Юникод и utf8
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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