Обсуждение:Импорт базы ФМС. тоже не медленно.

0 (0)
  • Развернуть Обсуждение:Импорт базы ФМС. тоже не медленно. ( Обсуждение примера  21.11.2014 10:25 )
    0(0)
    Посмотрел как работает импорт файла list_of_expired_passports.csv и стало мне грустно. Долго и на планировщик не повесишь. Пользовать альтернативные варианты тоже не хотелось, для сохранения совместимости с RS. В результате родилась такая технология. Первый этап происходит на Unix машине, которая имеет выход в интернет. Код скрипта не привожу, думаю каждый напишет его под свою конфигурацию сам, опишу лишь основные моменты.
    1) получаем файл при помощи
    wget http://www.fms.gov.ru/upload/expired-passports/list_of_expired_passports.csv.bz2
    2) распаковываем
    bzip2 -d list_of_expired_passports.csv.bz2
    3) сортируем и добавляем дату в имя при помощи
    sort list_of_expired_passports.csv >list_of_expired_passports.$y$m$d.csv
    4) сравниваем с предыдущим при помощи
    comm -3 list_of_expired_passports.$y$m$d.csv list_of_expired_passports.$old_y$old_m$old_d.csv >fms_diff_$y$m$d.txt

    Далее, уже машина с АБС забирает файл fms_diff_yyyymmdd.txt из буферной зоны и можно грузить в RS. Ниже код функции импорта.

    Всё это можно организовать и на машине с RS-ом через GnuUtils, но sort отожрёт пару гигов оперативки минут на десять.

    PS. Стоит подчеркнуть, что после "comm -3" получается файл, в котором нет строк, существующих и в предыдущем и в текущем файле. Новые данные начинаются с начала строки, а данные отсутствующие в новой версии файла (подлежащие удалению) начинаются с табулятора.
    Первый раз грузится весь файл штатной процедурой RS. Затем грузятся только обновления, полученные приведённым алгоритмом. Обновления грузятся кодом примера. При остутствии данных в кэше загрузка занимает около минуты времени.
    Посмотреть пример
    >> Ответить
    • Развернуть А можно ли узнать поподробнее… ( Назарова Анна  21.11.2014 11:06 )
      0(0)
      >>Посмотрел как работает импорт файла list_of_expired_passports.csv и стало мне грустно…

      Подскажите, пожалуйста,
      1) на какой версии RS-Bank’а Вы выполняли штатную загрузку этого csv-файла?
      2) Сколько длилась эта загрузка?
      3) Сколько записей было в csv-файле и какой размер файла?
      4) В 3-х или 2-х звенке выполнялась загрузка?
      5) Где находился загружаемый файл: на сервере или в сети?
      6) Какие параметры «железа»: Процессор, Опер. память, ОС?
      7) сколько времени занимает загрузка файла после применения технологии из Вашего примера?

      С уважением, Назарова Анна
      Руководитель проекта «RS-Bank v.5.5»


      >> Ответить
      • Развернуть можно... ( tema  21.11.2014 12:51 )
        0(0)
        1) .51
        2) на тестовом 2-3 часа, на рабочем меньше часа, но более получаса
        3) как у всех
        4) 3-х
        5) на сервере, это ни на что особо не влияет 1 гиг по сети переливается несравнимо быстрее, чем идёт импорт
        6) тестовый сервер не укладывается в текущие требования, рабочий укладывается
        7) 1 секунду, если кэш не сброшен
        >> Ответить
        • Развернуть Еще информация.. ( Назарова Анна  21.11.2014 14:42 )
          0(0)
          Спасибо.

          А еще вопросы:
          сколько в Вашем примере занимают времени "подготовительные" этапы

          3) сортируем и добавляем дату в имя при помощи
          4) сравниваем с предыдущим при помощи


          И по поводу «…и на планировщик не повесишь..» просто для информации:
          В версии 5.50.003.53 (тираж 12-15 декабря) по запросу 171479 будет добавлена возможность загрузки стоп-листа паспортов в автономном режиме. Для этого необходимо указать modnum:145 exec:2151 src:Путь к файлу rewrite:1.
          Параметр scr - принимает путь к файлу, rewrite - указывает на перезапись справочника, при отсутствии справочник обновляется.

          С уважением, Назарова Анна.
          >> Ответить
    • Развернуть Очень интересная технология. После сортировки - можно получить поисковый файл без СУБД. ( sergksa  25.11.2014 15:54 )
      0(0)
      Добрый день. Мне ваша технология очень понравилась.

      Обенно интересно было узнать про возможности Unix и GNU утилит.

      Основная нагрузка падает на утилиту sort и как показало тестирование со своей функцией отлично справляется.

      Сразу зачесались руки использовать файл, полученный после sort, как поисковый половинчатым методом.

      набросал макрос и спешу тоже поделиться:

      т.е. в сортированный файл (ваш шаг 3) не добавляем дату в имя.. кладем его в доступное место для RS и макрос поиска плохих паспортов мог бы быть таким:

      
      var paspfilename="..\\txtfile\\list_of_expired_passports.txt	";
      
      
      Macro Pasp_in_file(p_ser: string, p_num: string): bool; //sk
      	var p1=0, p2 = 0,half,i,findstr;
             var sss,pr,sn1,sn2,rzd=strfor(10),pasplen=12;//длина нормального паспорта вместе с разделителями
      	var pasp = TStream (paspfilename);
      
      
      
      	while (strLen(p_ser)<4)
      		p_ser=string("0", p_ser);
      	end;
      
      	while (strLen(p_num)<6)
      		p_num=string("0", p_num);
      	end;
      
      	findstr = rzd+p_Ser+","+p_Num;
           p2 = pasp.GetSize;
      
           while (p2-p1>pasplen)
      
             half = p1+int((p2-p1)/2);
             if (half<pasplen) half=0; end;
      
             pasp.SetPos(half);
             pasp.Read(sss, V_STRING, pasplen*10);
      
      //  [############# ########### ############# #] (p1,p2,half,strsubst(sss,rzd," "));
      
             if (half==0)
               sss=rzd+sss;
             else
               i=index(sss,rzd);
               if (i==0) return false; end;
               half=half+i-1;
               sss=substr(sss,i);
             end;
             if (index(sss,findstr)>0) return true; end;
             if (sss>findstr) p2=half ; end;
             if (sss<findstr) p1=half ; end;
            end; //while
            return false;
      
      end;
      
      //test
      [##########](Pasp_in_file("0000","000001"));
      [##########](Pasp_in_file("0000","000002"));
      [##########](Pasp_in_file("0000","000004"));
      [##########](Pasp_in_file("0000","000006"));
      [##########](Pasp_in_file("0000","000011"));
      [##########](Pasp_in_file("5302","985944"));
      
      
      

      т.е. можно проверять паспорта, практически мгновенно не закачивая их даже в базу..

      но это лишь как вариант... как всегда не лишенный недостатков ...


      Вам огромное спасибо.




      >> Ответить
      • Развернуть Штатную проверку отключаете? ( JVR  25.11.2014 17:22 )
        0(0)
        Добрый день!
        Правильно ли я понял - штатную проверку в справочнике клиентов вы отключаете?
        Я залил в штатный справочник только 1.5млн паспортов, включил штатную проверку и опера не смогли открыть нового клиента - в момент сохранения паспортных данных система уходит в нирвану.

        >> Ответить
        • Развернуть Вы про какую штатную проверку, не совсем понятно. Куда, что и чем заливали? ( tema  25.11.2014 17:30 )
          0(0)
          Not specified
          >> Ответить
          • Развернуть В стоп-лист ( JVR  25.11.2014 17:34 )
            0(0)
            В Финмон \ Справочники \ Стоп-лист удостоверений личности
            В этот справочник загрузил (для теста) часть записей из list_of_expired_passport.cvs

            При сохранении паспортных данных в справочнике клиентов выполняется штатная проверка на попадание в этот справочник ...
            >> Ответить
            • Развернуть В pidstlst.dbt??? ( tema  25.11.2014 17:51 )
              0(0)
              Не правильно. list_of_expired_passport.cvs надо грузить в стоп-лист паспортов.
              Для этого выписали свою собственную процедуру?
              Стоп-лист удостоверений личности грузится в pidstlst.dbt
              Стоп-лист паспортов в invalp?.dbt

              Я штатную проверку не отключал, работает она очень быстро. Медленно работает лишь загрузка. Мой алгоритм расчитан как раз на штатную проверку.

              Отключа или нет коллега sergksa не знаю, не думаю, что это сильно влияет на ввод клиентов.


              >> Ответить
      • Развернуть Прикольно :) ( tema  25.11.2014 17:25 )
        0(0)
        Not specified
        >> Ответить