powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
25 сообщений из 209, страница 6 из 9
Два число в одно и обратно
    #39158273
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://ru.wikipedia.org/wiki/Паспорт_гражданина_Российской_Федерации

Серия и номер паспорта записываются в формате XX XX YYYYYY, где XX XX — 4-значная серия паспорта и YYYYYY — 6-значный номер паспорта.

Первые две цифры серии паспорта соответствуют коду ОКАТО региона, в котором выдан паспорт; третья и четвертая цифры серии паспорта соответствуют последним двум цифрам года выпуска бланка паспорта (допускается отклонение на 1-3 года). Пример: паспорт серии 45 04 выдан в городе Москва, бланк выпущен в 2004 году, а паспорт серии 37 11 выдан в Курганской области, бланк выпущен в 2011 году.

На 2 и 3 страницах паспорта серия и номер паспорта нанесены в паспорте типографским способом. До 2008 года серия и номер были также нанесены типографской краской на последующих страницах. С 2008 года на страницах с 5 по 20, а также на задней обложке серия и номер нанесены методом лазерной перфорации.

Третья и четвертые цифры наводят на мысль, что они имеют малое количество значений.
И похоже им можно поставить некоторое битовое значение /например 4 бита/
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158288
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TPS Серий на сегодня порядка 90*16 = 1440,
в данных неимоверное количество мусора, ждём разъяснений от топикстартера
Он же написал
__Avenger__1. Я его сортирую, потом оставляю только паспорта РФ. Другие не интересуют.
т.е. только то что попадает под маску XXXX XXXXXX где X цифра.

Посчитал: всего 96`383`652 записей, подходящих 96`373`705, среди них 2806 серий.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158289
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилDima TPS Серий на сегодня порядка 90*16 = 1440,
в данных неимоверное количество мусора, ждём разъяснений от топикстартера

Весь мусор в помойку. Остаются только паспорта рф \d{4},\d{6}.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел, есть целые диапазоны, т.е. от нескольких номеров подряд до сотен. Их можно хранить так
Код: sql
1.
номер, диапазон


для диапазона достаточно одного байта.
Чтобы одиночным диапазон=1 не прописывать, можно хранить диапазоны в отдельной секции или файле.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158302
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Весь мусор в помойку. Остаются только паспорта рф \d{4},\d{6}
3-4 цифра в серии не вызывает доверия (год печати бланка) в ряде случаев
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158718
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПошел изучать чудесный bzip2, который жмет лучше RAR`аУ "block sorted" ест багофича - на плохо сжимаемых данных получается пятипроцентный оверхед.

P.S. imho, лучше изучить LZMA(2)
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158742
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения. А автору нужно минимизировать репликацию?
Или хранение. Или структуру к которой идёт доступ на поиски?

Это может быть 3 разных солюшена.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158771
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал выгрузки, под спойлерами форматы.
По 4 байта на значение
Код: sql
1.
2.
3.
4.
5.
6.
7.
1000000 + серия1
номер1
номер2
..
1000000 + серия2
номер1
номер2


По 3 байта на значение
Код: sql
1.
2.
3.
4.
5.
6.
7.
1000000 + серия1
номер1
номер2
..
1000000 + серия2
номер1
номер2


По 3 байта c дельтами
0x0 это байт с нулем
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
0x0,1000000 + серия1
номер1
если номер2 - номер1 < 256 тогда {номер2 - номер1} иначе {0x0,номер2}
если номер3 - номер2 < 256 тогда {номер3 - номер2} иначе {0x0,номер3}
..
0x0,1000000 + серия2
номер1
если номер2 - номер1 < 256 тогда {номер2 - номер1} иначе {0x0,номер2}
..


Мест где сработало "иначе" всего 36000 оказалось.

Результаты:
Выгрузка размер пожатый RARПо 4 байта367 Мб 34 MbПо 3 байта275 Мб 33 Mbc дельтами92 Мб 30 Мб

Смотрю файл с дельтами - много единичек, т.е. возможно вариант с диапазонами взлетит
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
1000000 + серия1 // тут одиночные номера
Номер1
Номер10
Номер11
..
2000000 + серия1 // тут диапазоны: Начало, размер
Номер2,5
...


Хотя не думаю что намного ниже 30 Мб будет в архиве.

ИМХУ Для передачи лучше копать в сторону репликации, т.к. данные в основном только добавляются. Не надо гонять полное состояние. Достаточно слать на клиента только обновления и немного инфы для контроля целостности его копии. Плюс механизм восстановления при частичном разрушении копии.

PS Использовал RAR5 с дефолтными настройками. Выше пробовал максимальное сжатие ставить, как оказалось меньше архив не стал, а время в 10 раз увеличилось.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158918
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диапазоны будут удобны для поиска. Перегнал в такую структуру
По три байта с диапазонами
Код: sql
1.
2.
3.
4.
5.
6.
7.
1000000 + серия1
номер1,диапазон
номер2,диапазон
..
1000000 + серия2
номер1,диапазон
номер2,диапазон


т.е. номерХ три байта, диапазон 1 байт.
номерХ + диапазон = последний номер диапазона

Диапазонов оказалось 44,7 млн. из 96, т.е. записей вдвое меньше.

Дополню результаты
Выгрузка размер пожатый RARПо 4 байта367 Мб 34 MbПо 3 байта 275 Мб 33 Mbc дельтами92 Мб 30 Мбc диапазонами 170 Мб 38 Мб
Я бы сравнивал выделенные цифры. Для поиска хранить диапазоны гораздо выгоднее. Вариант с дельтами для поиска не подходит, т.к. там можно искать только перебором.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159004
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

надо все кодировать длинами диапазонов включений-исключений, начиная с номера 0
например, в некоторой серии есть номера: 2, 7-11, 18
значит, диапазоны такие: 0-1 не входит, 2-2 входит, 3-6 не входит, 7-11 входит, 12-17 не входит, 18-18 входит, 19-999999 не входит,
а их длины: 2, 1, 4, 5, 6, 1, 999979
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159031
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если цифры 2, 1, 4, 5, 6, 1, 999979 представить как длины чередующихся
чёрно белых отрезков пикселей на картинке - то получим довольно старую
известную схему сжатия факсимильных картинок.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159034
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Именно эта схема кодирования имелась в виду.
С учетом переменной длины 1-3 байта на код, сжатие должно быть очень неплохим.
Длину кода можно разместить в старшем бите младшего и среднего байта.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159036
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

или в двух старших битах младшего байта:
0х = 1, причем x является частью (старшим битом) значения;
10 = 2;
11 = 3;
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159038
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я прошу прощения. Но к чему нам сжатие?
Ведь суть этой БД или инфо-системы
в том чтобы оперативно извлекать статус по каждому паспорту.

По сути нам надо имплементировать интерфейс

Код: c#
1.
2.
3.
interface PassportService{
   boolean isActive(string PassportNum);
}


Мы тут сломаем тонну копьев, а всё для чего? Для репликации? Так ли она важна?
Может важнее продумать как обеспечить имплементацию для интерфейса что я
описал?

Если таковой не нужен - ну... пускай автор скажет.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159040
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

тут вроде он сказал 18742992
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159045
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ну ОК. Половинным делением. Хм...
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159050
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

кстати, похоже, при наших данных битовая карта для каждой серии будет и меньше, и быстрее.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159051
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С репликацией тоже не все так однозначно.
Пусть есть три файла за разные даты 1, 2, 3. На текущий момент актуальна база номер 3.
Что бы перевести 1 файл в 3-тий, надо накатить репликации а) 12 + 23 или б) 13
Что бы перевести 2 файл в 3-тий, надо накатить репликации 23
А вот на второй файл накатить репликацию 13 нельзя! Это приведет к неправильному файлу.

Поэтому приходится сейчас выделять некий базовый файл, и относительно его и текущего файла находить разность. Разность будет расти с каждым днем.
Этот базовый файл есть на всех удаленных офисах. На него накладывается текущая разность и получаем новый файл с актуальными данными.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159053
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА ну ОК. Половинным делением. Хм...

Довольно быстро работает, требуется порядка 10-15 чтений из файла (с буфферным чтением - физически происходит одно чтение в память блока 1МБ).

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
399141: Pos=     3616, PosMin=        0, PosMax=     7232, Delta=  7232
 83162: Pos=     1808, PosMin=        0, PosMax=     3616, Delta=  3616
 18252: Pos=      904, PosMin=        0, PosMax=     1808, Delta=  1808
  4459: Pos=      452, PosMin=        0, PosMax=      904, Delta=   904
  1349: Pos=      224, PosMin=        0, PosMax=      452, Delta=   452
   345: Pos=      112, PosMin=        0, PosMax=      224, Delta=   224
    99: Pos=       56, PosMin=        0, PosMax=      112, Delta=   112
    23: Pos=       28, PosMin=        0, PosMax=       56, Delta=    56
     4: Pos=       12, PosMin=        0, PosMax=       28, Delta=    28
     2: Pos=        4, PosMin=        0, PosMax=       12, Delta=    12
     1: Pos=        0, PosMin=        0, PosMax=        4, Delta=     4
TRUETRUE
771737: Pos=240718032, PosMin=240638112, PosMax=240797956, Delta=159844
751692: Pos=240678072, PosMin=240638112, PosMax=240718032, Delta= 79920
741920: Pos=240658092, PosMin=240638112, PosMax=240678072, Delta= 39960
737410: Pos=240648100, PosMin=240638112, PosMax=240658092, Delta= 19980
739627: Pos=240653096, PosMin=240648104, PosMax=240658092, Delta=  9988
740817: Pos=240655596, PosMin=240653100, PosMax=240658092, Delta=  4992
740248: Pos=240654348, PosMin=240653100, PosMax=240655596, Delta=  2496
740538: Pos=240654972, PosMin=240654352, PosMax=240655596, Delta=  1244
740691: Pos=240655284, PosMin=240654976, PosMax=240655596, Delta=   620
740613: Pos=240655128, PosMin=240654976, PosMax=240655284, Delta=   308
740648: Pos=240655208, PosMin=240655132, PosMax=240655284, Delta=   152
740670: Pos=240655248, PosMin=240655212, PosMax=240655284, Delta=    72
740659: Pos=240655228, PosMin=240655212, PosMax=240655248, Delta=    36
740665: Pos=240655240, PosMin=240655232, PosMax=240655248, Delta=    16
TRUETRUE
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159055
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__,

прелесть битовой карты в том, что требуется одно чтение маленького блока
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159058
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov__Avenger__,

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

Спасибо, посмотрю на досуге что это такое.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159063
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ... поскольку мозговой штурм еще идёт то и я еще подкину дров.

С первых страниц топика меня не покидало ощущение что эта задача
похожа на MaxMind и базу блоков IP адресов. Характерные особенности -
ярко выраженные префиксы (серии паспортов). И диапазоны.

Коробочное решение - дерево остатков RadixTree. Оно эффективно на поисках
и вставках.

К сожалению у меня совершенно нет никакой формулы чтобы оценить
расходы на хранение дерева на диске. По этому вопросу надо гуглить.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159103
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__С репликацией тоже не все так однозначно.
Пусть есть три файла за разные даты 1, 2, 3. На текущий момент актуальна база номер 3.
Что бы перевести 1 файл в 3-тий, надо накатить репликации а) 12 + 23 или б) 13
Что бы перевести 2 файл в 3-тий, надо накатить репликации 23
А вот на второй файл накатить репликацию 13 нельзя! Это приведет к неправильному файлу.

Поэтому приходится сейчас выделять некий базовый файл, и относительно его и текущего файла находить разность. Разность будет расти с каждым днем.
Этот базовый файл есть на всех удаленных офисах. На него накладывается текущая разность и получаем новый файл с актуальными данными.
Это слишком примитивно. Хотя и этот подход можно использовать, но только добавить хэши файлов.
Имя файла обновления: XXXX_<MD5old>_<MD5new>.upd, где XXXX номер обновления, MD5old хэш исходного файла, MD5new хэш после обновления.

На клиенте считаешь MD5 текущего состояния, запрашиваешь файл *_<MD5>_*.upd накатываешь, проверяешь что MD5curr = MD5new, если совпало - фиксируешь изменения. Дальше по кругу.

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

Тут минусы: при редком обновлении клиенту надо накатить много файлов, если что-то сглючит, то придется качать полное состояние.

Надо полноценную репликацию 18744100 18744168 и данные на сервере хранить в СУБД
Тогда клиент просто сообщает свое состояние, а сервер отправляет какие надо изменения до текущего состояния. Тут любая частота обновлений сервера.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159108
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Формат сейчас такой: карта по сериям 10000 Int = 80000 байтов + 96 000 000 записей по 4 байта.
ИМХУ вполне нормальная структура для поиска:
1. Читаем с места серия * 4, получаем расположение блока номеров (тут я бы добавил еще конец блока, т.к. следующей серии может не быть и надо читать пока не попадется следующая присутствующая серия), или сразу получаем что серии нет.
2. Ищем в блоке номеров. Размер блока максимум 4 Мб. Бинарным поиском максимум 20 чтений.

Как вариант п.2 заменить на биткарту, тогда на каждую серию надо будет 125000 байт под биткарту с номерами, или весь файл 350 Мб (2806 серий) максимум 1,25 Гб для всех серий.
Хоть файл и распухнет, но чтений станет всего два: 4 байта по серии смещение до биткарты + 1 байт биткарты.

Еще плюсы: изменение не требует формирования файла с нуля. Для добавления/удаления номера просто установить/сбросить нужный бит. Добавление новой серии: добавить биткарту в конец, в заголовке прописать смещение до биткарты.

Сжиматься архиватором наверно будет похуже, но не намного. Расчет разницы двух файлов можно будет делать в один проход, или использовать rsync и забыть про расчеты обновлений.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159116
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__С репликацией тоже не все так однозначно.
Пусть есть три файла за разные даты 1, 2, 3.
Стоп. Нет никаких файлов - есть база данных и её реплики
...
Рейтинг: 0 / 0
25 сообщений из 209, страница 6 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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