powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
25 сообщений из 209, страница 7 из 9
Два число в одно и обратно
    #39159123
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ прошу прощения. Но к чему нам сжатие?
Ведь суть этой БД или инфо-системы
в том чтобы оперативно извлекать статус по каждому паспорту.
Согласен.

Но обсуждение этого вопроса /на мой взгляд/ имеет смысл продолжить в части способов эффективного
и компактного представления данных.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159127
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012,
компактного представления для репликации или поиска?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159135
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилкомпактного представления для репликации или поиска?Общетеоретического.
Без контекста обсуждения необходимости использования этого в базах данных.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159174
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир2012Общетеоретического.
для разных задач - разные алгоритмы
иначе - обсуждение сферического коня в вакууме
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159177
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилдля разных задач - разные алгоритмы
иначе - обсуждение сферического коня в вакуумеРечь шла об конкретной задаче.
И она в какой-то мере типична.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159262
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__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

Поясни, как ты используешь половиное деление если у тебя в текстовом файле существуют
записи не выровненные на границу кратную 12 байтам (10 символов + запятая + 0x0A)

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

26M - сжатая RARом битовая карта,
30M - сжатые RARом дельты,
85M - дельты без сжатия,
333M - битовая карта без сжатия,
1103M - оригинальный csv-файл.

Неотлаженный Некрасивый Недоделанный Исходник для справки
Код: pascal
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.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
unit ExpiredPassports;

interface

type
  TPassportMap= array of array of byte;

procedure MapInclude(var Map: TPassportMap; Serial, No: integer);
procedure MapExclude(var Map: TPassportMap; Serial, No: integer);
function MapTest(var Map: TPassportMap; Serial, No: integer): boolean;

procedure LoadPassportList(var Map: TPassportMap; const FileName: string);

procedure SavePassportMap(var Map: TPassportMap; const FileName: string);
procedure LoadPassportMap(var Map: TPassportMap; const FileName: string);

procedure SavePassportPacket(var Map: TPassportMap; const FileName: string);
procedure LoadPassportPacket(var Map: TPassportMap; const FileName: string);

implementation

type
  TBuffer= array[0..999999] of byte;

procedure MapInclude(var Map: TPassportMap; Serial, No: integer);
begin;
  if (Serial<0) or (Serial>9999) or (No<0) or (No>999999) then exit;
  if Length(Map)=0 then SetLength(Map, 10000);
  if Length(Map[Serial])=0 then begin;
    SetLength(Map[Serial], 125000);
    FillChar(Map[Serial,0], 125000, 0);
    end;
  Map[Serial, No shr 3]:=1 shl (No and 7) or Map[Serial, No shr 3];
  end;

procedure MapExclude(var Map: TPassportMap; Serial, No: integer);
begin;
  if (Serial<0) or (Serial>9999) or (No<0) or (No>999999) then exit;
  if Length(Map)=0 then exit;
  if Length(Map[Serial])=0 then exit;
  Map[Serial, No shr 3]:=(not (1 shl (No and 7))) and Map[Serial, No shr 3];
  end;

function MapTest(var Map: TPassportMap; Serial, No: integer): boolean;
begin;
  Result:=false;
  if (Serial<0) or (Serial>9999) or (No<0) or (No>999999) then exit;
  if Length(Map)=0 then exit;
  if Length(Map[Serial])=0 then exit;
  Result:=1 shl (No and 7) and Map[Serial, No shr 3]<>0;
  end;

function SubstrToInt(const s: string; i1, i2: integer): integer;
var
  i, c: integer;
begin;
  Result:=0;
  for i:=i1 to i2 do begin;
    c:=ord(s[i])-ord('0');
    if cardinal(c)>9 then begin;
      Result:=-1;
      exit;
      end;
    Result:=Result*10+c;
    end;
  end;

procedure LoadPassportList(var Map: TPassportMap; const FileName: string);
var
  Fi: Text;
  s: string;
begin;
  Map:=nil;
  Assign(Fi, Filename); Reset(Fi);
  while not EOF(Fi) do begin;
    ReadLn(Fi, s);
    if (Length(s)=11) and (s[5]=',')
    then MapInclude(Map, SubstrToInt(s,1,4), SubstrToInt(s,6,11));
    end;
  CloseFile(Fi);
  end;

procedure SavePassportMap(var Map: TPassportMap; const FileName: string);
var
  Fi: file;
  Serial: integer;
begin;
  Assign(Fi, Filename); Rewrite(Fi,1);
  for Serial:=0 to Length(Map)-1 do if Length(Map[Serial])=125000 then begin;
    BlockWrite(Fi, Serial, 4);
    BlockWrite(Fi, Map[Serial,0], 125000);
    end;
  CloseFile(Fi);
  end;

procedure LoadPassportMap(var Map: TPassportMap; const FileName: string);
var
  Fi: file;
  Serial, Count: integer;
begin;
  Map:=nil; SetLength(Map, 10000);
  Assign(Fi, Filename); Reset(Fi,1);
  while true do begin;
    BlockRead(Fi, Serial, 4, Count);
    if Count=0 then break;
    if (Count<>4) or (Serial<0) or (Serial>9999) then begin;
      Map:=nil; break;
      end;
    SetLength(Map[Serial], 125000);
    BlockRead(Fi, Map[Serial,0], 125000, Count);
    if Count<>125000 then begin;
      Map:=nil; break;
      end;
    end;
  CloseFile(Fi);
  end;

procedure EncodeDelta(var Buf: TBuffer; var BufPos: integer; Delta: integer);
begin;
  if Delta<=$7F then begin;
    Buf[BufPos]:=Delta;
    inc(BufPos);
    end
  else if Delta<=$3FFF then begin;
    Buf[BufPos]:=Delta and $3F or $80;
    Buf[BufPos+1]:=Delta shr 6;
    inc(BufPos, 2);
    end
  else begin;
    Buf[BufPos]:=Delta and $3F or $C0;
    Buf[BufPos+1]:=Delta shr 6;
    Buf[BufPos+2]:=Delta shr 14;
    inc(BufPos, 3);
    end;
  end;

procedure SavePassportPacket(var Map: TPassportMap; const FileName: string);
var
  Fi: file;
  Serial, No, OldNo, Val, Bit, BufPos, i, j: integer;
  Buf: TBuffer;
begin;
  Assign(Fi, Filename); Rewrite(Fi,1);
  for Serial:=0 to Length(Map)-1 do if Length(Map[Serial])=125000 then begin;
    BlockWrite(Fi, Serial, 4);
    Bit:=Map[Serial,0] and 1;
    BlockWrite(Fi, Bit, 1);
    No:=0; OldNo:=0; BufPos:=0;
    for i:=0 to 125000-1 do begin;
      Val:=Map[Serial,i];
      if (Val=0) and (Bit=0) or (Val=255) and (Bit<>0) then begin;
        inc(No, 8);
        continue;
        end
      else for j:=0 to 7 do begin;
        if Val and 1<>Bit then begin;
          EncodeDelta(Buf, BufPos, No-OldNo-1);
          OldNo:=No;
          Bit:=Bit xor 1;
          end;
        inc(No);
        Val:=Val shr 1;
        end
      end;
    EncodeDelta(Buf, BufPos, No-OldNo-1);
    BlockWrite(Fi, BufPos, 4);
    BlockWrite(Fi, Buf[0], BufPos);
    end;
  CloseFile(Fi);
  end;

function DecodeDelta(var Buf: TBuffer; var BufPos: integer): integer;
begin;
  Result:=Buf[BufPos];
  if Result<=$7F then begin;
    inc(BufPos);
    end
  else if Result<=$BF then begin;
    Result:=integer(Buf[BufPos+1]) shl 6
         or Result and $3F;
    inc(BufPos, 2);
    end
  else begin;
    Result:=integer(Buf[BufPos+2]) shl 14
         or integer(Buf[BufPos+1]) shl 6
         or Result and $3F;
    inc(BufPos, 3);
    end;
  end;

procedure LoadPassportPacket(var Map: TPassportMap; const FileName: string);
var
  Fi: file;
  Serial, No, OldNo, Bit, BufLen, BufPos: integer;
  Buf: TBuffer;
var
  Count: integer;
begin;
  Map:=nil; SetLength(Map, 10000);
  Assign(Fi, Filename); Reset(Fi,1);
  while true do begin;
    BlockRead(Fi, Serial, 4, Count);
    if Count=0 then break;
    if (Count<>4) or (Serial<0) or (Serial>9999) then begin;
      Map:=nil; break;
      end;
    Bit:=0; BlockRead(Fi, Bit, 1, Count); Bit:=Bit xor 1;
    if (Count<>1) or (Bit and -2<>0) then begin;
      Map:=nil; break;
      end;
    BlockRead(Fi, BufLen, 4, Count);
    if (Count<>4) or (BufLen<=0) or (BufLen>SizeOf(Buf)) then begin;
      Map:=nil; break;
      end;
    BlockRead(Fi, Buf[0], BufLen, Count);
    if Count<>BufLen then begin;
      Map:=nil; break;
      end;
    SetLength(Map[Serial], 125000);
    No:=0; OldNo:=0; BufPos:=0;
    while BufPos<BufLen do begin;
      No:=DecodeDelta(Buf, BufPos)+1+No;
      Bit:=Bit xor 1;
      if (BufPos>BufLen) or (No>999999+1) then break;
      if Bit=0 then while OldNo<No do begin;
        if (OldNo and 7=0) and (OldNo+7<No) then begin;
          Map[Serial, OldNo shr 3]:=0;
          inc(OldNo, 8);
          end
        else begin;
          Map[Serial, OldNo shr 3]:=(not (1 shl (OldNo and 7))) and Map[Serial, OldNo shr 3];
          inc(OldNo);
          end;
        end
      else while OldNo<No do begin;
        if (OldNo and 7=0) and (OldNo+7<No) then begin;
          Map[Serial,OldNo shr 3]:=$FF;
          inc(OldNo, 8);
          end
        else begin;
          Map[Serial, OldNo shr 3]:=1 shl (oldNo and 7) or Map[Serial, OldNo shr 3];
          inc(OldNo);
          end;
        end;
      end;
    if (BufPos<>BufLen) or (No<>999999+1) then begin;
      Map:=nil; break;
      end;
    end;
  CloseFile(Fi);
  end;

end.

...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159333
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TЭто слишком примитивно. Хотя и этот подход можно использовать, но только добавить хэши файлов.
Имя файла обновления: XXXX_<MD5old>_<MD5new>.upd, где XXXX номер обновления, MD5old хэш исходного файла, MD5new хэш после обновления.

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

Хорошая идея, спасибо.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159335
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПоясни, как ты используешь половиное деление если у тебя в текстовом файле существуют
записи не выровненные на границу кратную 12 байтам (10 символов + запятая + 0x0A)

Пример таких записей я нашёл

Прочитай сообщение 18742992 . Все номера паспортов выровнены на границу 4 байта. Серии хранятся в массиве серий от [0..10000].
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159339
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovЛучше всего сжимается битовая карта:

26M - сжатая RARом битовая карта,
30M - сжатые RARом дельты,
85M - дельты без сжатия,
333M - битовая карта без сжатия,
1103M - оригинальный csv-файл.

Мощно, какое-то слишком сложное кодирование исходящего буффера. А за сколько у Вас формируется файл с битовой картой?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159345
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Прочитай сообщение 18742992 . Все номера паспортов выровнены на границу 4 байта. Серии хранятся в массиве серий от [0..10000].

должно быть и есть - это разные вещи

зачем ты нам файл с мусором выдал?

номер серии из двух знаков,
нецифровые символы в номере,
год печати бланка из будущего,
советские номера серий

Неужели на основании таких данных можно делать адекватные данные о валидности паспорта?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159348
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Aleksandr SharahovЛучше всего сжимается битовая карта:

26M - сжатая RARом битовая карта,
30M - сжатые RARом дельты,
85M - дельты без сжатия,
333M - битовая карта без сжатия,
1103M - оригинальный csv-файл.

Мощно, какое-то слишком сложное кодирование исходящего буффера. А за сколько у Вас формируется файл с битовой картой?

Последовательно по 3 раза вызов каждой процедуры:
List loaded OK 45895ms
List loaded OK 44882ms
List loaded OK 44772ms
Map loaded OK 6397ms
Map loaded OK 421ms
Map loaded OK 421ms
Packet loaded OK 2512ms
Packet loaded OK 2496ms
Packet loaded OK 2496ms
Map saved OK 343ms
Map saved OK 359ms
Map saved OK 343ms
Packet saved OK 2293ms
Packet saved OK 2293ms
Packet saved OK 2294ms
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159349
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил__Avenger__Прочитай сообщение 18742992 . Все номера паспортов выровнены на границу 4 байта. Серии хранятся в массиве серий от [0..10000].

должно быть и есть - это разные вещи

зачем ты нам файл с мусором выдал?

номер серии из двух знаков,
нецифровые символы в номере,
год печати бланка из будущего,
советские номера серий

Неужели на основании таких данных можно делать адекватные данные о валидности паспорта?

Этот вопрос не ко мне, а сюда . Сейчас многие обязаны по закону проверять паспорт, согласно перечня ФСФМ или на сайте. Такие у нас законы.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159380
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Мощно, какое-то слишком сложное кодирование исходящего буффера.
Там все элементарно:
допустим S это номер первого байта биткарты в файле, N номер паспорта. Дальше читаем из файла байт (S+N/8) работаем с битом N % 8
чтобы не делать деление и получения остатка (это тяжелые операции) можно их заменить:
деление на 8 - это битовый сдвиг вправо на 3 бита (>> 3)
остаток от деления на 8 - это получение последних трех бит (&7)
Смотря на чем пишешь, на С/С++ можно не менять, компилятор за тебя поменяет.

Для работы с нужным битом:
пусть К номер бита (0-7). Получаем маску M = 1 << K. т.е. битовый сдвиг влево 1 на К разрядов. Математически M = 2^K. Например: при К = 4, M будет 16 или в двоичной 00010000
B - текущее содержимое байта.
Проверка текущего значения бита: (B & M) != 0 (true - установлен)
Установка бита: B = B | M
Сброс бита: B = B & (~M)

&, |, ~ побитовые операции И, ИЛИ, НЕ

При генерации с нуля, для ускорения, лучше сначала все посчитать в памяти, затем результат сбросить на диск.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159383
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__Этот вопрос не ко мне, а сюда . Сейчас многие обязаны по закону проверять паспорт, согласно перечня ФСФМ или на сайте. Такие у нас законы.
ИМХУ вопрос к тебе, как изучившему предметную область.

Например есть там запись 01,591132. Можно трактовать по разному: 0001,591132 и 0100,591132. Очевидно что нужен один из них, но какой? ФСФМ что-нибудь разъясняет по этому поводу? Есть какие-то рекомендации как это трактовать?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159387
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TФСФМ что-нибудь разъясняет по этому поводу?
http://services.fms.gov.ru/info-service.htm?sid=2000 Данный сервис является информационным, предоставляемая информация не является юридически значимой.
no comments
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159388
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T__Avenger__Этот вопрос не ко мне, а сюда . Сейчас многие обязаны по закону проверять паспорт, согласно перечня ФСФМ или на сайте. Такие у нас законы.
ИМХУ вопрос к тебе, как изучившему предметную область.

Например есть там запись 01,591132. Можно трактовать по разному: 0001,591132 и 0100,591132. Очевидно что нужен один из них, но какой? ФСФМ что-нибудь разъясняет по этому поводу? Есть какие-то рекомендации как это трактовать?

Трактовать как ошибочное значение,
в чем легко убедиться, если отправить запрос в ФМС на этот URL.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159391
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мусор на входе - мусор на выходе

а какие собственно законы требуют применения этого говносервиса?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159393
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovТрактовать как ошибочное значение,
в чем легко убедиться, если отправить запрос в ФМС на этот URL.
Попробовал там вбить. 01 не говорит неверно ввели, 0001 и 0100 говорит отсутствует. Получается надо просто игнорить все серии что не подходят под маску XXXX где X цифра.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159395
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опечатка
01 не говорит неверно ввели
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159411
Белка123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропил,

Ну например, 115-фз и 499-п.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159422
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Белка123Изопропил,

Ну например, 115-фз и 499-п.

как это совместить с "Данный сервис является информационным, предоставляемая информация не является юридически значимой"
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159458
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__Avenger__maytonПоясни, как ты используешь половиное деление если у тебя в текстовом файле существуют
записи не выровненные на границу кратную 12 байтам (10 символов + запятая + 0x0A)

Пример таких записей я нашёл

Прочитай сообщение 18742992 . Все номера паспортов выровнены на границу 4 байта. Серии хранятся в массиве серий от [0..10000].
Спасибо. А сколько времени (мс)у тебя занимает поиск 1 паспорта по этому файлу?
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159472
Белка123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ИзопропилБелка123Изопропил,

Ну например, 115-фз и 499-п.

как это совместить с "Данный сервис является информационным, предоставляемая информация не является юридически значимой"

ЦБ это не волнует. Сказано проверять и все.
...
Рейтинг: 0 / 0
Два число в одно и обратно
    #39159499
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСпасибо. А сколько времени (мс)у тебя занимает поиск 1 паспорта по этому файлу?
ИМХУ если правильно бинарный поиск реализовать будет быстрее дерева, медленнее биткарты.
По сути это 10-20 чтений с диска по 4 байта. Причем Последние 10 чтений из 1-2 соседних кластеров (если кластер 4 Кб). Т.е. время поиска не больше времени рандомного чтения 10 кластеров.

Еще одно интересное наблюдение: 50% номеров содержатся в 150 сериях
Код: sql
1.
select seria, count(*) from pas group by seria order by 2 desc


СерияКол-во номеров800457791180035532622503548911800554026432045320284045314084500520041503514190650450714782035069382003491027650348231265024814724004481202500347996557034711301034680719204466153400546248745064598125203458630450745700475034567293054557992203455639400245433432004526509203451882530345183345014498244505448794180344397492054411654003440890450243669645034344284504430080360442784160044229466505422687304421592630342116375004192772202417013460140952540040748746064066014508406575500440406160024004249201399667460539803030339506770339503146033808834023784514604374489800236763845093673613003643623013631394602359497800135799046073558146003355543410335491436023547616005346637760034107410434088657043371893202336596180433186945983315186304320352650030014445102956447504295450750229505118012932902804287123500028443733042834807003281410410227883060012729848042686894600265620220426345314042605129402258314460825697736012525801012517426704251710200424913325042470857042464231504244173920724388120012428577002241843170423965015022319469403228812409922815732012278233062278062501223833501220689400022062511042205612200217349110221146280121091028022096391402205489360520369180220257082022018591702200930970420063156021993744202199278730419290253001927624597190491690218958278041881565402185916680218514952011848833206183673370218294481031816509802180274400717967867021790595701177965100217476371041747103302173899870217385660081728217102172335520516992856031695391800169216701166013

В принципе объяснимо: сроки действия истекли и люди паспорт меняют.

ИМХУ надо смешанный формат хранения:
биткарта на одну серию 125000 байт или 31250 номеров по 4 байта или 41667 по 3 байта.
Т.е. там где номеров больше 31250/41667 меньше места займет биткарта.

При 4 байтовом номере экономия 263 Мб, т.е. файл будет ~104 Мб
При 3 байтовом номере экономия 178,5 Мб, т.е. файл будет ~97 Мб

Некогда писать, на неделе время будет, затестю.
...
Рейтинг: 0 / 0
25 сообщений из 209, страница 7 из 9
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Два число в одно и обратно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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