|
|
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
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 бита/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:26 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima TPS Серий на сегодня порядка 90*16 = 1440, в данных неимоверное количество мусора, ждём разъяснений от топикстартера Он же написал __Avenger__1. Я его сортирую, потом оставляю только паспорта РФ. Другие не интересуют. т.е. только то что попадает под маску XXXX XXXXXX где X цифра. Посчитал: всего 96`383`652 записей, подходящих 96`373`705, среди них 2806 серий. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:38 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
ИзопропилDima TPS Серий на сегодня порядка 90*16 = 1440, в данных неимоверное количество мусора, ждём разъяснений от топикстартера Весь мусор в помойку. Остаются только паспорта рф \d{4},\d{6}. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:41 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Посмотрел, есть целые диапазоны, т.е. от нескольких номеров подряд до сотен. Их можно хранить так Код: sql 1. для диапазона достаточно одного байта. Чтобы одиночным диапазон=1 не прописывать, можно хранить диапазоны в отдельной секции или файле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:51 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Весь мусор в помойку. Остаются только паспорта рф \d{4},\d{6} 3-4 цифра в серии не вызывает доверия (год печати бланка) в ряде случаев ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:52 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Dima TПошел изучать чудесный bzip2, который жмет лучше RAR`аУ "block sorted" ест багофича - на плохо сжимаемых данных получается пятипроцентный оверхед. P.S. imho, лучше изучить LZMA(2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 16:44 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Прошу прощения. А автору нужно минимизировать репликацию? Или хранение. Или структуру к которой идёт доступ на поиски? Это может быть 3 разных солюшена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 16:56 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Сделал выгрузки, под спойлерами форматы. По 4 байта на значение Код: sql 1. 2. 3. 4. 5. 6. 7. По 3 байта на значение Код: sql 1. 2. 3. 4. 5. 6. 7. По 3 байта c дельтами 0x0 это байт с нулем Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Мест где сработало "иначе" всего 36000 оказалось. Результаты: Выгрузка размер пожатый RARПо 4 байта367 Мб 34 MbПо 3 байта275 Мб 33 Mbc дельтами92 Мб 30 Мб Смотрю файл с дельтами - много единичек, т.е. возможно вариант с диапазонами взлетит Код: sql 1. 2. 3. 4. 5. 6. 7. 8. Хотя не думаю что намного ниже 30 Мб будет в архиве. ИМХУ Для передачи лучше копать в сторону репликации, т.к. данные в основном только добавляются. Не надо гонять полное состояние. Достаточно слать на клиента только обновления и немного инфы для контроля целостности его копии. Плюс механизм восстановления при частичном разрушении копии. PS Использовал RAR5 с дефолтными настройками. Выше пробовал максимальное сжатие ставить, как оказалось меньше архив не стал, а время в 10 раз увеличилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 17:16 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Диапазоны будут удобны для поиска. Перегнал в такую структуру По три байта с диапазонами Код: sql 1. 2. 3. 4. 5. 6. 7. т.е. номерХ три байта, диапазон 1 байт. номерХ + диапазон = последний номер диапазона Диапазонов оказалось 44,7 млн. из 96, т.е. записей вдвое меньше. Дополню результаты Выгрузка размер пожатый RARПо 4 байта367 Мб 34 MbПо 3 байта 275 Мб 33 Mbc дельтами92 Мб 30 Мбc диапазонами 170 Мб 38 Мб Я бы сравнивал выделенные цифры. Для поиска хранить диапазоны гораздо выгоднее. Вариант с дельтами для поиска не подходит, т.к. там можно искать только перебором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 19:11 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 22:33 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Если цифры 2, 1, 4, 5, 6, 1, 999979 представить как длины чередующихся чёрно белых отрезков пикселей на картинке - то получим довольно старую известную схему сжатия факсимильных картинок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 23:51 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
mayton, Именно эта схема кодирования имелась в виду. С учетом переменной длины 1-3 байта на код, сжатие должно быть очень неплохим. Длину кода можно разместить в старшем бите младшего и среднего байта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 23:58 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov, или в двух старших битах младшего байта: 0х = 1, причем x является частью (старшим битом) значения; 10 = 2; 11 = 3; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:10 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Я прошу прощения. Но к чему нам сжатие? Ведь суть этой БД или инфо-системы в том чтобы оперативно извлекать статус по каждому паспорту. По сути нам надо имплементировать интерфейс Код: c# 1. 2. 3. Мы тут сломаем тонну копьев, а всё для чего? Для репликации? Так ли она важна? Может важнее продумать как обеспечить имплементацию для интерфейса что я описал? Если таковой не нужен - ну... пускай автор скажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:11 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
А ну ОК. Половинным делением. Хм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:23 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
mayton, кстати, похоже, при наших данных битовая карта для каждой серии будет и меньше, и быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:31 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
С репликацией тоже не все так однозначно. Пусть есть три файла за разные даты 1, 2, 3. На текущий момент актуальна база номер 3. Что бы перевести 1 файл в 3-тий, надо накатить репликации а) 12 + 23 или б) 13 Что бы перевести 2 файл в 3-тий, надо накатить репликации 23 А вот на второй файл накатить репликацию 13 нельзя! Это приведет к неправильному файлу. Поэтому приходится сейчас выделять некий базовый файл, и относительно его и текущего файла находить разность. Разность будет расти с каждым днем. Этот базовый файл есть на всех удаленных офисах. На него накладывается текущая разность и получаем новый файл с актуальными данными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:35 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:40 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__, прелесть битовой карты в том, что требуется одно чтение маленького блока ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:47 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Aleksandr Sharahov__Avenger__, прелесть битовой карты в том, что требуется одно чтение маленького блока Спасибо, посмотрю на досуге что это такое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 00:50 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Ну ... поскольку мозговой штурм еще идёт то и я еще подкину дров. С первых страниц топика меня не покидало ощущение что эта задача похожа на MaxMind и базу блоков IP адресов. Характерные особенности - ярко выраженные префиксы (серии паспортов). И диапазоны. Коробочное решение - дерево остатков RadixTree. Оно эффективно на поисках и вставках. К сожалению у меня совершенно нет никакой формулы чтобы оценить расходы на хранение дерева на диске. По этому вопросу надо гуглить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 01:13 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__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 и данные на сервере хранить в СУБД Тогда клиент просто сообщает свое состояние, а сервер отправляет какие надо изменения до текущего состояния. Тут любая частота обновлений сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 09:00 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Формат сейчас такой: карта по сериям 10000 Int = 80000 байтов + 96 000 000 записей по 4 байта. ИМХУ вполне нормальная структура для поиска: 1. Читаем с места серия * 4, получаем расположение блока номеров (тут я бы добавил еще конец блока, т.к. следующей серии может не быть и надо читать пока не попадется следующая присутствующая серия), или сразу получаем что серии нет. 2. Ищем в блоке номеров. Размер блока максимум 4 Мб. Бинарным поиском максимум 20 чтений. Как вариант п.2 заменить на биткарту, тогда на каждую серию надо будет 125000 байт под биткарту с номерами, или весь файл 350 Мб (2806 серий) максимум 1,25 Гб для всех серий. Хоть файл и распухнет, но чтений станет всего два: 4 байта по серии смещение до биткарты + 1 байт биткарты. Еще плюсы: изменение не требует формирования файла с нуля. Для добавления/удаления номера просто установить/сбросить нужный бит. Добавление новой серии: добавить биткарту в конец, в заголовке прописать смещение до биткарты. Сжиматься архиватором наверно будет похуже, но не намного. Расчет разницы двух файлов можно будет делать в один проход, или использовать rsync и забыть про расчеты обновлений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.01.2016, 09:31 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39159036&tid=1340797]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
145ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 516ms |

| 0 / 0 |
