powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
25 сообщений из 209, страница 5 из 9
Два число в одно и обратно
    #39157874
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TТам одними цифрами все не ограничивается, про перегон в int можно забыть.
кентавра можно сделать
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157882
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне помнится я Базисту предложил задачку об Украинских налоговых номерах.
Десяти-значный номер. И есть много интересных закономерностей для
уплотнения и хранения.

Лучшие задачи проекта
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157908
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Допаковалось.
Исходный файл был пожат, весил 344 Мб
Он же пожатый RAR5 с максимальным сжатием 367 Мб
Он же отсортированный и пожатый RAR5 с максимальным сжатием 171 Мб

Пошел изучать чудесный bzip2, который жмет лучше RAR`а

PS слать обновления будет намного компактней.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157968
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОн же пожатый RAR5 с максимальным сжатием 367 МбЧто-то тут не так.
WinRAR 4.20 сжал исходный CSV-файл за 6 минут на некрутом ноутбуке - 354 349 190 байт. Правда, для этого пришлось в опциях сжатия включить принудительное распознавание текста.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157989
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот чудаки. Преобразуйте этот поток шлака в дельта-код и еще раз закодируйте.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157992
__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 МБ. Сколько это в архиве - не знаю.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157994
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если использовать БД, то все это слишком медленно работает, и слишком много накладных расходов. Размер БД как минимум будет 3 ГБ. Говоря, что медленно работает, имею ввиду перестройку индексов, + вставку удаление и нахождение разностей. Поиск будет мгновенным.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157997
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Поэтому написана утилита которая находит разности между двумя бинарными файлами.Имхо, если искать разницу между текстовыми вариантами, ее сортировать и сжимать, то получится экономичнее.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157998
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Размер БД как минимум будет 3 ГБ.Если в MySQL использовать InnoDB-таблицу из двух полей SMALLINT и MEDIUMINT (это 2 и 3 байта соответственно), то будет что-то в диапазоне 0,5-1 ГБ.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39157999
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Это с учетом индекса? Или natural-ом искать буду? Как разности между файлами найти? Это еще два поля - Дата добавления и дата удаления записи. + Еще два индекса.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158001
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Это с учетом индекса?Это и есть индекс. Таблицы InnoDB - это фактически и есть первичный ключ таблицы с довеском из остальных полей, если они есть.
__Avenger__и дата удаления записиА разве из этого списка могут удаляться записи исходя из его сути?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158007
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Как разности между файлами найти?Хотел предложить diff, но, похоже, его нет под Windows.
Но есть вот: https://en.wikipedia.org/wiki/WinMerge WinMerge is a free software tool for data comparison and merging of text-like files.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158009
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,

Да, записи могут удаляться. Мало того в 1 день были на 2-й удалили в 3-й добавили опять.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158034
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да там практически - sequence. В отсортированом варианте.
Если убрать стрёмные буквенные номера типа XVАГ,????????.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158044
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДа там практически - sequence. В отсортированом варианте.Тогда можно попытаться работать с диапазонами. Это еще увеличит компактность данных.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158047
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-же говорю. Архиватор не умеет видеть так далеко. Он не сечёт поток целых чисел в виде строк.
Дайте ему более явную энтропию. Дайте на вход дельта-код. Может даже RLE в данном случае будет выигрышнее
всех других методов.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158059
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нашёл googl-овую реализацию Bloom-filter. Заинтересовало какой будет оверхед при
вероятности ошибки 0.00001.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
package mayton.tests;

import com.google.common.base.Charsets;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnel;
import com.google.common.hash.PrimitiveSink;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.concurrent.Immutable;

public class App {
    
    public static void main(String[] args) {        
        
        BloomFilter<Person> friends = BloomFilter.create(personFunnel, 96_383_652, 0.00001);
....


По отладчику. (Не знал как поднять детали инстанциирования параметров). Очевидная инфа:

Нужно аллоцировать память в

2 309 607 327 / 8 = 288 700 915 байт = 275 Мb

двести семсят пять метров.

При этом неверно детектированые "дохлые" паспорта составят (насколько я понимаю смысл).

96 383 652 * 0.00001 = 963 штуки

На скрине с брейпойнтом можно также выкурить еще всяких интересных штук. Типа колчество
хеш-функций которые будут задейсвованы а также название алгоритма.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158077
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли убрать стрёмные буквенные номера типа XVАГ,????????.
это пущай топикстартер объяснит как оно попало в список.
по идее все такие паспорта должны быть невалидны
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158156
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Можно ли запаковать в один Int(4-байта) два числа, первое - не превышает 9999, второе - не превышает 999999?Типичная задача, которую решают архиваторы.
Но они опираются на контекст всего содержимого данных.
В вашем случае возможны только решение для частных случаев.
К примеру значение какого-либо имеет ряд дискретных значений или заведомо входящих в некоторый диапазон.
В целом /без знания контекста данных/ данная задача не разрешима.

См. https://ru.wikipedia.org/wiki/Информационная_энтропия
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158191
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__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 + серия1
номер1
номер2
..
1000000 + серия2
номер1
номер2


т.е. если значение >= 1000000 это следующая серия. Максимум будет 1009999, что меньше 1048576 (2^20).
Так можно использовать три байта на один паспорт, если со сдвигами пошаманить то 5 байт на две записи.

Второй вариант вместо абсолютного номера хранить смещение (дельту от предыдущего номера), как mayton предложил 18742953
Примерно так:
Код: sql
1.
2.
3.
4.
5.
1000000 + серия1
номер1
номер2-номер1
номер3-номер2
...


Тут надо реальное распределение смотреть, думаю можно будет подстроится чтобы уложиться в 1-2 байта на номер.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158222
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012В вашем случае возможны только решение для частных случаев.
К примеру значение какого-либо имеет ряд дискретных значений или заведомо входящих в некоторый диапазон.
В целом /без знания контекста данных/ данная задача не разрешима.
дык это и есть частный случай - номера российских паспортов
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158241
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно что-то типа репликации использовать:
На сервере все хранить в БД и добавить поле TIMESTAMP или просто счетчик. При каждом добавлении в это поле писать значение счетчика, счетчик увеличивать.
Синхронизация примерно так:
1. Клиент присылает значение TIMESTAMP своей копии
2. Сервер обратно отправляет все записи с большим TIMESTAMP и текущее максимальное значение TIMESTAMP. Дополнительно хэши каждой серии.
3. Клиент добавляет к себе новые данные, запоминает значение TIMESTAMP, проверяет хэши, если по какой-то серии не совпало - запрашивает полное обновление этой серии.

Так удаление можно использовать и хранить уже отсортированное.

PS Серий на сегодня порядка 90*16 = 1440, при 16 байт на хэш будет ~23 Кб
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158252
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю в качестве хэша можно вместо MD5 можно что-нибудь покороче взять, например CRC32
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158259
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TPS Серий на сегодня порядка 90*16 = 1440,
в данных неимоверное количество мусора, ждём разъяснений от топикстартера
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39158260
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По удаленным можно отдельную таблицу завести, при удалении переносить туда с установкой TIMESTAMP, и при отправке обновления клиенту из этой таблицы тоже слать список на удаление.
...
Рейтинг: 0 / 0
25 сообщений из 209, страница 5 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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