Важная информация
RSS лента

Dimon012

Извращения SQLite

Рейтинг: 4.00. Голосов: 3.
Сегодня сделал загрузку данных из текстовых файлов в базу данных. Базу данных создаю в памяти, потом к ней подключаю базу данных на диске, получаю как бы цельную базу данных. Загрузка базы данных представляет собой, двухступенчатую процедуру:
1. Циклическое чтение строки из текстового файла, разбор строки, запись данных в таблицу находящуюся в памяти.
2. Копирование информации из таблицы в памяти (MTemperLoad) в таблицу на диске (TemperGlobal), следующим запросом
INSERT INTO TemperGlobal (dolg, shir, temp, date) SELECT Mdolg, Mshir, Mtemp, Mdate FROM MTemperLoad
(Ранее процедура была одноступенчатой, чтение и сразу запись в таблицу на диске)
Такое решение позволило на порядки увеличить скорость загрузки, я сам поражен! Раньше данные из файла размером в 47000 строк грузились за время около 1,5 часов, сегодня удалось загрузить данные из файла размером в 80000 строк за 26 секунд!!!!!
P.S. видимо одновременное чтение из файла и запись в базу (на диске) сильно тормозит процесс.
Метки: Нет Добавить / редактировать метки
Категории
Без категории

Комментарии

  1. Аватар для Dimon012
    Прошу прощения, не видел Вашего запроса.
    Если еще есть интерес, то попытаюсь кое что объяснить.
    Прежде всего это база SQLite, на самом деле она представляет собой просто файл, никакого сервера нет. Меня в данном случае интересует простейший вариант, т.к. система однопользовательская.
    Циклическое чтение означает, что из текстового файла читается одна строка, которая содержит данные о географических координатах и температуре в этой точке, далее цикл повторяется читается следующея строка с такимиже данными.

    Код :
      if FileExists(UTF8ToAnsi('Loading/'+NameFile))=True Then
      Begin
        AssignFile(FN,UTF8ToAnsi('Loading/'+NameFile));
        Reset(FN);
        I:=0;
        Repeat
          ReadLn(FN,Str);
          nom:=Pos(',',Str);
          DolStr:=copy(Str,1,nom-1);
          Str:=copy(Str,nom+1,(Length(Str)-nom));
          nom:=Pos(',',Str);
          ShirStr:=copy(Str,1,nom-1);
          Str:=copy(Str,nom+1,(Length(Str)-nom));
          If Pos(',',Str)<>0 then
          Begin
            nom:=Pos(',',Str);
            AltStr:=copy(Str,1,nom-1);
          end
          else Begin
            AltStr:=Str;
          end;
          Dolgota:=StrVFloat(DolStr);
          Shirota:=StrVFloat(ShirStr);
          Altimetr:=StrVFloat(AltStr);
          If (Altimetr<>0) AND (Dolgota<>0) AND (Shirota<>0) Then
          Begin
            SQL_query:='INSERT INTO MAltimetriyaLoad (Mdolg, Mshir, MAlt, Mdate) '+
                       'VALUES ("'+DolStr+'","'+
                                   ShirStr+'","'+
                                   AltStr+'","'+
                                   FloatVStr(Date)+'")';
            Form1.ExecSQLPower(SQL_query,'Ошибка при заполнении таблицы MAltimetriyaLoad ',5);
            I:=I+1;
          end;
          Form1.SBrMain.Panels[1].Text:='A='+IntToStr(I);
          //Form1.application.ProcessMessages;
        //until eof(FN) OR (EProcessStop.Checked=True);
        until eof(FN);
        CloseFile(FN);
        SQL_query:='INSERT INTO Altimetriya (dolg, shir, Alt, date) '+
                   'SELECT Mdolg, Mshir, MAlt, Mdate FROM MAltimetriyaLoad';

    Таблица "MAltimetriyaLoad" располагается в памяти компьютера, таблица "Altimetriya" располагается в файле на жестком диске.
    "ExecSQLPower" это моя процедура обработки SQL запроса.
  2. Аватар для Dimon012
    Данные предоставить не могу, т.к. информация закрытая, приведу несколько строчек из исходного текстового файла:

    Код :
    147.87707077433,45.117070681408,-5,,,
    147.47700062367,45.515794282205,-5,,,
    147.25672451365,45.766292974872,-5,,,
    159.95764805981,46.930361709624,5,,,
    159.65313719111,46.930028986831,5,,,
    И вот таких строк от 25000 до 90000.

    Никак не соображу как пристегнуть файл базы данных, могу выслать на мыло, если интересует.
  3. Аватар для Dimon012
    Да последнее для доступа к базе данных я использую класс-обертку:

    Код :
    (*
     Простой класс для использования базовых функций библиотеки SQLite (exec и get_table).
     
     TSQLiteDatabase - это обёртка для открытия и закрытия БД SQLite.
     Также она позволяет вызвать SQLite_exec для запросов, которые возвращают наборы данных.
     
     TSQLiteTable - обёртка для выполнения SQL-запросов.
     Она выполняет запрос и записывает возвращаемые им строки во внутренний буфер.
     Она позволяет обращаться к полям таблицы по именами и обеспечивает навигацию по полям
     (переход к первой и последней строкам, шаг на одну строку вперёд/назад).
     
     Благодарности
      * Оригинальный модуль - Pablo Pissanetzky (pablo@myhtpc.net)
      * Адаптация к Delphi - Tim Anderson (tim@itwriting.com)
      * Модификация и расширения - Lukas Gebauer, Tobias Gunkel
      * Удаление лишних и дублирующих классов/методов; изменения для большей совместимости
        со стандартным компонентом TQuery; перенос части функций в Private-зону - Nikolay Petrochenko (www.megabyte-web.ru)
    *)