|
|
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Dima TТам одними цифрами все не ограничивается, про перегон в int можно забыть. кентавра можно сделать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 19:26 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Мне помнится я Базисту предложил задачку об Украинских налоговых номерах. Десяти-значный номер. И есть много интересных закономерностей для уплотнения и хранения. Лучшие задачи проекта ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 19:34 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Допаковалось. Исходный файл был пожат, весил 344 Мб Он же пожатый RAR5 с максимальным сжатием 367 Мб Он же отсортированный и пожатый RAR5 с максимальным сжатием 171 Мб Пошел изучать чудесный bzip2, который жмет лучше RAR`а PS слать обновления будет намного компактней. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 20:06 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Dima TОн же пожатый RAR5 с максимальным сжатием 367 МбЧто-то тут не так. WinRAR 4.20 сжал исходный CSV-файл за 6 минут на некрутом ноутбуке - 354 349 190 байт. Правда, для этого пришлось в опциях сжатия включить принудительное распознавание текста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 21:40 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Вот чудаки. Преобразуйте этот поток шлака в дельта-код и еще раз закодируйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:27 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
1. Я его сортирую, потом оставляю только паспорта РФ. Другие не интересуют. Формат сейчас такой: карта по сериям 10000 Int = 80000 байтов + 96 000 000 записей по 4 байта. Итоговый файл занимает 386 мегабайтов. В архиве - WinRar 4.2 - 35 МБ. 7-zip жмет до 50 МБ. 2. Поиск по файлу конкретного паспорта осуществляю методом половинного деления. По серии определяю позиции начала и окончания блока данных в бинарном файле 3. 35 МБ для удаленных офисов - очень большой трафик. Как правило DialUp или GPRS. Поэтому написана утилита которая находит разности между двумя бинарными файлами. На удаленные офисы приходят эти разности. Разность за год по подсчетам должна быть примерно 6 байтов на запись * 40 000 изменений в день * 250 дней = 57 МБ. Сколько это в архиве - не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:41 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Если использовать БД, то все это слишком медленно работает, и слишком много накладных расходов. Размер БД как минимум будет 3 ГБ. Говоря, что медленно работает, имею ввиду перестройку индексов, + вставку удаление и нахождение разностей. Поиск будет мгновенным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:43 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Поэтому написана утилита которая находит разности между двумя бинарными файлами.Имхо, если искать разницу между текстовыми вариантами, ее сортировать и сжимать, то получится экономичнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:45 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Размер БД как минимум будет 3 ГБ.Если в MySQL использовать InnoDB-таблицу из двух полей SMALLINT и MEDIUMINT (это 2 и 3 байта соответственно), то будет что-то в диапазоне 0,5-1 ГБ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:49 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
miksoft, Это с учетом индекса? Или natural-ом искать буду? Как разности между файлами найти? Это еще два поля - Дата добавления и дата удаления записи. + Еще два индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:53 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Это с учетом индекса?Это и есть индекс. Таблицы InnoDB - это фактически и есть первичный ключ таблицы с довеском из остальных полей, если они есть. __Avenger__и дата удаления записиА разве из этого списка могут удаляться записи исходя из его сути? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 22:57 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Как разности между файлами найти?Хотел предложить diff, но, похоже, его нет под Windows. Но есть вот: https://en.wikipedia.org/wiki/WinMerge WinMerge is a free software tool for data comparison and merging of text-like files. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 23:01 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
miksoft, Да, записи могут удаляться. Мало того в 1 день были на 2-й удалили в 3-й добавили опять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 23:04 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Да там практически - sequence. В отсортированом варианте. Если убрать стрёмные буквенные номера типа XVАГ,????????. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 23:34 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
maytonДа там практически - sequence. В отсортированом варианте.Тогда можно попытаться работать с диапазонами. Это еще увеличит компактность данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.01.2016, 23:58 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Я-же говорю. Архиватор не умеет видеть так далеко. Он не сечёт поток целых чисел в виде строк. Дайте ему более явную энтропию. Дайте на вход дельта-код. Может даже RLE в данном случае будет выигрышнее всех других методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 00:06 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Нашёл googl-овую реализацию Bloom-filter. Заинтересовало какой будет оверхед при вероятности ошибки 0.00001. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. По отладчику. (Не знал как поднять детали инстанциирования параметров). Очевидная инфа: Нужно аллоцировать память в 2 309 607 327 / 8 = 288 700 915 байт = 275 Мb двести семсят пять метров. При этом неверно детектированые "дохлые" паспорта составят (насколько я понимаю смысл). 96 383 652 * 0.00001 = 963 штуки На скрине с брейпойнтом можно также выкурить еще всяких интересных штук. Типа колчество хеш-функций которые будут задейсвованы а также название алгоритма. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 01:02 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
maytonЕсли убрать стрёмные буквенные номера типа XVАГ,????????. это пущай топикстартер объяснит как оно попало в список. по идее все такие паспорта должны быть невалидны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 01:55 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__Можно ли запаковать в один Int(4-байта) два числа, первое - не превышает 9999, второе - не превышает 999999?Типичная задача, которую решают архиваторы. Но они опираются на контекст всего содержимого данных. В вашем случае возможны только решение для частных случаев. К примеру значение какого-либо имеет ряд дискретных значений или заведомо входящих в некоторый диапазон. В целом /без знания контекста данных/ данная задача не разрешима. См. https://ru.wikipedia.org/wiki/Информационная_энтропия ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 08:45 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
__Avenger__1. Я его сортирую, потом оставляю только паспорта РФ. Другие не интересуют. Формат сейчас такой: карта по сериям 10000 Int = 80000 байтов + 96 000 000 записей по 4 байта. Итоговый файл занимает 386 мегабайтов. В архиве - WinRar 4.2 - 35 МБ. 7-zip жмет до 50 МБ. 2. Поиск по файлу конкретного паспорта осуществляю методом половинного деления. По серии определяю позиции начала и окончания блока данных в бинарном файле 3. 35 МБ для удаленных офисов - очень большой трафик. Как правило DialUp или GPRS. Поэтому написана утилита которая находит разности между двумя бинарными файлами. На удаленные офисы приходят эти разности. Разность за год по подсчетам должна быть примерно 6 байтов на запись * 40 000 изменений в день * 250 дней = 57 МБ. Сколько это в архиве - не знаю. ИМХУ надо разделить задачи: на передачу и использование. Т.е. один формат для передачи, второй для поиска. При получении делать конвертацию из первого во второй. Как понимаю проблемы именно с передачей, как вариант: сделать синхронизацию по типу rsync, т.е. обновление только измененных частей файла. Только надо исключить операцию удаления, например использовать замену на невалидный номер. Тем более что для данной задачи удаление крайне редкая операция. Тогда все операции сведутся к добавлению и изменению. Дальше протокол обмена примерно такой: 1. Клиент разбивает свою копию на блоки, посылает хэш каждого и общий размер. Например если разбить на 64 блока и по каждому посчитать MD5, то запрос будет 16*64 = 1024 байта + немного доп.инфы. 2. Сервер в ответ посылает все что добавилось ( > размера копии клиента), проверяет хэши, если у какого-то блока не совпало, сообщает номер блока клиенту. 3. Клиент дописывает хвост, по измененному блоку разбивает его еще на 64 и отправляет хэши серверу. 4. Сервер проверяет и отправляет клиенту блоки по которым хэш не совпал. и т.д. Можно просто с rsync разобраться и его использовать. Главное чтобы удалений не было. Т.к. удаление редкость, то в 99% случаев все сведется к отправке добавившегося. Полную передачу тоже можно оптимизировать. Тут можно утрамбовать все номера в 20 бит, т.е. 3 байта, если использовать такой формат: Код: sql 1. 2. 3. 4. 5. 6. 7. т.е. если значение >= 1000000 это следующая серия. Максимум будет 1009999, что меньше 1048576 (2^20). Так можно использовать три байта на один паспорт, если со сдвигами пошаманить то 5 байт на две записи. Второй вариант вместо абсолютного номера хранить смещение (дельту от предыдущего номера), как mayton предложил 18742953 Примерно так: Код: sql 1. 2. 3. 4. 5. Тут надо реальное распределение смотреть, думаю можно будет подстроится чтобы уложиться в 1-2 байта на номер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 09:21 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Владимир2012В вашем случае возможны только решение для частных случаев. К примеру значение какого-либо имеет ряд дискретных значений или заведомо входящих в некоторый диапазон. В целом /без знания контекста данных/ данная задача не разрешима. дык это и есть частный случай - номера российских паспортов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 09:48 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Можно что-то типа репликации использовать: На сервере все хранить в БД и добавить поле TIMESTAMP или просто счетчик. При каждом добавлении в это поле писать значение счетчика, счетчик увеличивать. Синхронизация примерно так: 1. Клиент присылает значение TIMESTAMP своей копии 2. Сервер обратно отправляет все записи с большим TIMESTAMP и текущее максимальное значение TIMESTAMP. Дополнительно хэши каждой серии. 3. Клиент добавляет к себе новые данные, запоминает значение TIMESTAMP, проверяет хэши, если по какой-то серии не совпало - запрашивает полное обновление этой серии. Так удаление можно использовать и хранить уже отсортированное. PS Серий на сегодня порядка 90*16 = 1440, при 16 байт на хэш будет ~23 Кб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:03 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Думаю в качестве хэша можно вместо MD5 можно что-нибудь покороче взять, например CRC32 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:12 |
|
||
|
Два число в одно и обратно
|
|||
|---|---|---|---|
|
#18+
Dima TPS Серий на сегодня порядка 90*16 = 1440, в данных неимоверное количество мусора, ждём разъяснений от топикстартера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2016, 10:15 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=39158222&tid=1340797]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
172ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
75ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 543ms |

| 0 / 0 |
