Как рационально объединить большие массивы структур. - страница 2

 
Georgiy Merts:

Кто нам мешает слить массивы и отсортировать их по времени ?

Это структуры. Разве можно сортировать по значению структуры в массиве? Если можно, подскажите, как

Georgiy Merts:

Если массивы уже отсортированы - то и сортировать не надо - пишем алгоритм сливания с двумя указателями на каждом массиве, просматриваем следующий элемент на обоих, и скидываем в результирующий массив более ранний элемент, одновременно передвигая указатель на этом исходном массиве. 

Видимо, придется так и делать. Я надеялся, что, может, будет более стандартный вариант. Надо тестить, но боюсь, что большой массив будет обрабатываться несколько секунд. А в моем случае, это не допустимо.

 

я конечно могу ошибаться, но сдаётся мне эта операция называется Join и есть она в любой СУБД и лучше данные изначально держать там.

посмотрите - в CodeBase должны быть либы для MySQL,SQLite (обе точно есть), MS-SQL и по идее должно быть ODBC вообще почти для всего что работает в винде.

 
Sergey Savinkin:

Здравствуйте, уважаемые участники форума.

У меня есть 2 очень больших массива (может быть до миллиона элементов) структур вида

Их нужно объединить так, чтобы недостающие элементы (по времени) из одного массива попали в другой. Пример на картинке. Сохранить последовательность по времени необходимо.

Подскажите, как это можно сделать максимально рационально (максимально быстро).

В MS Access можно сделать моментально.

 
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.
 
Sergey Savinkin:
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.

MQL -> DLL ->любая БД. Имхо, проще всего SQLite - там сама СУБД DLL. И писать не в файл, а в БД, ну и читать оттуда при необходимости.

 
Sergey Savinkin:
Можно и в Access, и в SQL, и в любой базе данных. У меня задача не просто объединить данные. Суть в том, что несколько индикаторов работают на одном графике (в разных терминалах) и пишут историю в один файл. Чтобы не было конфликтов, и один не затер данные другого, а наоборот - добавил пропуски, мне и нужно считывать большие массивы из файла, обновлять и записывать. А чтобы пропусков на истории было еще меньше - время считывания / проверки / перезаписи должно быть минимальным.

вы изобрели себе "бутылочное горлышко" и теперь героически преодолеваете трудности :-)

просто пишите в разные файлы. А данные пусть объединяет тот кто читает. На край можно в ночи в 23.57 запустить скрипт и объеденить прежние данные в архив

 
Sergey Savinkin:

Не работает. Вот это:

эээ если вы не в состоянии даже массивы проинициализировать нормально, я пас
 
Yuriy Asaulenko:

MQL -> DLL ->любая БД. Имхо, проще всего SQLite - там сама СУБД DLL. И писать не в файл, а в БД, ну и читать оттуда при необходимости.

Мысль понял, но моих знаний не хватит на организацию СУБД. Спасибо за совет.

 
Sergey Savinkin:

Мысль понял, но моих знаний не хватит на организацию СУБД. Спасибо за совет.

СУБД не надо организовывать.) Скажем Access, SQL Server, MySQL, SQLite и пр. - это и есть СУБД. Вам только таблицу(ы) сделать и немного язык SQL посмотреть. Экземплы делаем под себя, и все дела. Предварительно можно в Access немного потренироваться-отработать.

 

Сделал, как и рекомендовали, через перебор по 2-м указателям. Насколько быстро работает на больших массивах - сказать не могу, буду тестить.

void Func(Str_Arr &arr1[],Str_Arr &arr2[])
  {
   Str_Arr res[];

   int size1 = ArraySize(arr1);
   int size2 = ArraySize(arr2);

   int sizeRes=size1+size2;
   ArrayResize(res,sizeRes);
   int pos1=0,pos2=0,posRes=-1;
   for(int i=0; i<sizeRes; i++)
     {
      if(pos1>=size1) // массив 1 все...
        {
         if(pos2>=size2) // оба массива закончились
           {
            break;
           }
         posRes++;
         res[posRes].Time=arr2[pos2].Time;
         res[posRes].Price=arr2[pos2].Price;
         pos2++;
         continue;
        }
      else
        {
         if(pos2>=size2) // второй перебрали, остался первый
           {
            posRes++;
            res[posRes].Time=arr1[pos1].Time;
            res[posRes].Price=arr1[pos1].Price;
            pos1++;
            continue;
           }
        }

      // нужно сравнивать оба массива
      if(arr1[pos1].Time==arr2[pos2].Time) // одинаковые массивы, добавляем данные из любого 
        {
         posRes++;
         res[posRes].Time=arr1[pos1].Time;
         res[posRes].Price=arr1[pos1].Price;
         pos1++;
         pos2++;
        }
      else
        {
         if(arr1[pos1].Time<arr2[pos2].Time) // время первого меньше, двигаем его 
           {
            posRes++;
            res[posRes].Time=arr1[pos1].Time;
            res[posRes].Price=arr1[pos1].Price;
            pos1++;
           }
         else                                // а тут - второй массив
           {
            posRes++;
            res[posRes].Time=arr2[pos2].Time;
            res[posRes].Price=arr2[pos2].Price;
            pos2++;
           }
        }
     }
   ArrayResize(res,posRes+1);  // отрежем лишнее
  }

Спасибо всем, кто откликнулся.

P.S. Теоретически, можно и сортировку входящих массивов сделать, если создать двумерный массив типа double. Array[][1]. И в него перебором цикла скопировать этот массив (дату преобразовывать также в тип doouble). Дата помещается в первое измерение, цена - во второе. Сортировка двумерного массива по первому измерению возможна. После сортировки массив также перебирается и double обратно переформатируется в дату.

Причина обращения: