Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
Сначала для скептиков суть:
Есть конструкция состоящая из множества элементов, которые состоят ещё из множества элементов и те ещё раз из множества элементов. И всё это рассматривается в наборе точек по времени, да ещё и для разных исходных данных. Потому возможна ситуация массива аж 5 уровня вложенности (да даже больше возможно).

От задачи к задаче количество элементов радикально варьируется, от единиц - до тысяч, при том на каждом уровне. Использование статических массивов при обозначении максимального числа элементов приводить к слишком большим объемам в оперативной памяти.
Потому пришел к выводу использовать динамические массивы на всю глубину.

Структура данных представляет из себя что-то типа:

  TResult =record

     Calc_result            :array of TData;
     Forces                   :array of TData;
     DropTimes             :array of TData;
     ...Всякие параметры расчетов
  end;

  TData = record
   InTime       :array of TInTime;
   FilePath     :string;
   NTime        :Integer;
   Max,Min      :real;
   WithMax:  array [0..10] of integer; 
   MaxVal:   array [0..10] of real;
   Type:  array [1..10] of Byte;
   NType:     Byte;
  end;

  TInTime = record
    TV         :array of TTVS;
    NTV        :integer;
    DHeight    :array [1..10,1..101] of real;
    ND         :array [1..10] of Byte;
    TimeSec     :real;
    TimeDays    :real;
    WithMax:  array [0..10] of integer; 
    MaxVal:   array [0..10] of real;
    TVType:  array [1..10] of Byte;
    NTVType:     Byte;
  end;
....


Ну и так далее, как видите присутствуют ещё куча (тут далеко не все) параметры конкретного расчета/времени/сечения/..

Так вот, вопросы в следующем:
1. Корректно ли увеличивать массив (например самого нижнего уровня) при каждом добавлении на 1 элемент, особенно когда общий размер массива становится несколько сотен мегабайт? Если нет, то как это можно обойти, если до самого момента считывания я не могу не знать о размерах массива? Данные считываются из файлов (сотен файлов).
2. Существуют ли способы сразу указать для всех массивов нижнего уровня их размер не перебирая.
3. Существуют ли более удобные способы работы с таким форматом данных?

Пока у меня из мыслей только двухкратное считывание файлов:
первый раз для формирования размеров массивов, формируем размеры массивов,
второй раз уже заполняем.
Но тоже как-то костыльно...
25 июл 19, 10:11    [21934067]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 25764
Андрей Игоревич
Пока у меня из мыслей только двухкратное считывание файлов:
первый раз для формирования размеров массивов, формируем размеры массивов,
второй раз уже заполняем.
Но тоже как-то костыльно...

Все задачи не видно, только один отдельно взятый костыль.

Потому я-бы первым делом побеспокоился о том, чтобы файлы содержали информацию, позволяющую избегать избыточного (второго) чтения. В данном случае достаточно добавить в файл размерность данных любым удобным способом. Либо сменить на нечто вроде xml.

Цели у задачи тоже нет. Я-бы в её качестве использовал любую БД. В этом случае размерность не особо нужна при передаче данных.
25 июл 19, 10:24    [21934076]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
alekcvp
Member

Откуда:
Сообщений: 1485
Андрей Игоревич
Так вот, вопросы в следующем:
1. Корректно ли увеличивать массив (например самого нижнего уровня) при каждом добавлении на 1 элемент, особенно когда общий размер массива становится несколько сотен мегабайт? Если нет, то как это можно обойти, если до самого момента считывания я не могу не знать о размерах массива? Данные считываются из файлов (сотен файлов).
Нет, вы получите фрагментацию памяти и она закончится для вашего приложения раньше, чем реально закончится.

Андрей Игоревич
2. Существуют ли способы сразу указать для всех массивов нижнего уровня их размер не перебирая.
+ Да. Сделать их отдельным массивом и потом присваивать, т.к. динамические массивы - это указатели:

  TResult =record
    Calc_result            :array of TData;
    Forces                   :array of TData;
    DropTimes             :array of TData;
    ...Всякие параметры расчетов
  end;

  TData = record
    InTime       :array of TInTime;
    FilePath     :string;
    NTime        :Integer;
    Max,Min      :real;
    WithMax:  array of integer;  // в последних версиях лучше TArray<Integer>
    MaxVal:   array of real;
    Type:  array of Byte;
    NType:     Byte;
  end
...
  
var
  Record: TRecord;
  TempType: array of Byte; 

begin
  SetLength(TempType, 10);
  ...
  Record.Type := TempType;
  ...

Андрей Игоревич
3. Существуют ли более удобные способы работы с таким форматом данных?

Пока у меня из мыслей только двухкратное считывание файлов:
первый раз для формирования размеров массивов, формируем размеры массивов, второй раз уже заполняем.
Но тоже как-то костыльно...

ИМХО - самый нормальный подход. Второй вариант: заранее выделить буфер минимально-необходимого размера, которого гарантированно хватит для любых данных, после считывания из файла - выделять ещё один буфер по фактическому размеру данных, копировать их в него, а в исходный считывать новый файл. Что будет быстрее: ваш вариант или мой - зависит от разных условий.
25 июл 19, 10:33    [21934086]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
wadman
Все задачи не видно, только один отдельно взятый костыль.

Потому я-бы первым делом побеспокоился о том, чтобы файлы содержали информацию, позволяющую избегать избыточного (второго) чтения. В данном случае достаточно добавить в файл размерность данных любым удобным способом. Либо сменить на нечто вроде xml.

Цели у задачи тоже нет. Я-бы в её качестве использовал любую БД. В этом случае размерность не особо нужна при передаче данных.

Вся задача на данный момент - визуализация, обработка, сохранение результатов расчётов. Результаты получаются посредством другой расчётной программы, лезть в которую пока очень не хочется (хотя если припрет - придется, но в чужом коде разбираться ...). Про xml не в курсе.
С БД уже обжегся, когда надо быстро работать с миллионами значений скорость работы с обычными бесплатными БД (что очевидно) стоит на несколько(много, крайне много) порядков ниже работы с оперативной памятью.
25 июл 19, 10:47    [21934106]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
Андрей Игоревич, с какой БД работали?
25 июл 19, 11:03    [21934116]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
LocksmithPC
Андрей Игоревич, с какой БД работали?

Спросите что-нибудь попроще :), тем более у большинства названия "что-то-там-SQL-что-то-там".
Вроде Firebird и MySQL, но уже не помню.
А что существуют БД способные быть ну хотя бы не более чем в 100 раз медленнее, чем прямое обращение к ячейке оперативной памяти?
Думаю там вообще разница по скорости обращения и считывания в десятки тысяч раз, ну чисто технически. (если не брать монструозных серверов c огромными RAIDмассивами ССД дисков).
25 июл 19, 13:49    [21934349]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
Андрей Игоревич, а про индексы помните?
25 июл 19, 14:36    [21934403]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
alekcvp
Нет, вы получите фрагментацию памяти и она закончится для вашего приложения раньше, чем реально закончится.

Андрей Игоревич
2. Существуют ли способы сразу указать для всех массивов нижнего уровня их размер не перебирая.
+ Да. Сделать их отдельным массивом и потом присваивать, т.к. динамические массивы - это указатели:

  TResult =record
    Calc_result            :array of TData;
    Forces                   :array of TData;
    DropTimes             :array of TData;
    ...Всякие параметры расчетов
  end;

  TData = record
    InTime       :array of TInTime;
    FilePath     :string;
    NTime        :Integer;
    Max,Min      :real;
    WithMax:  array of integer;  // в последних версиях лучше TArray<Integer>
    MaxVal:   array of real;
    Type:  array of Byte;
    NType:     Byte;
  end
...
  
var
  Record: TRecord;
  TempType: array of Byte; 

begin
  SetLength(TempType, 10);
  ...
  Record.Type := TempType;
  ...

Андрей Игоревич
3. Существуют ли более удобные способы работы с таким форматом данных?

Пока у меня из мыслей только двухкратное считывание файлов:
первый раз для формирования размеров массивов, формируем размеры массивов, второй раз уже заполняем.
Но тоже как-то костыльно...

ИМХО - самый нормальный подход. Второй вариант: заранее выделить буфер минимально-необходимого размера, которого гарантированно хватит для любых данных, после считывания из файла - выделять ещё один буфер по фактическому размеру данных, копировать их в него, а в исходный считывать новый файл. Что будет быстрее: ваш вариант или мой - зависит от разных условий.

Ясно, спасибо, так, наверное, и поступлю.
25 июл 19, 14:56    [21934433]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
LocksmithPC
Андрей Игоревич, а про индексы помните?

Нет. А о чем речь?
Я когда тестировал - просто попробовал записать миллиард значений в БД, за несколько часов даже процента не записало (это с ССД).
При считывании в оперативную память хватает (с того же ССД в 64 битное приложение) - хватало несколько минут.
25 июл 19, 14:58    [21934439]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Мигалка
Member

Откуда:
Сообщений: 1244
вот уже почти два года автору говорят взять субд
отрицательный опыт автора с бд говорит только о квалификации автора и ничего не говорит о бд.
любая не файловая бд будет быстрее, потому что кроме физических чтений-записей, будут ещё логические и "бизнеслогика" которые сожрут времени в 1000, а вероятнее и в 1000000 раз больше в самописной реализации чем собственно операции с озу.
автор! бд будет отдавать вам данные из озу причем только те которые будут нужны вам сейчас. вам же не надо каждый миг обрабатывать все ваши десятки гигов, вам нужен какой-то срез или агрегат, а это как раз то что БД делает лучше всего. если, конечно, вы будете использовать БД как БД, а не тупое хранилище.
характерные скорости озу сейчас - десятки гигабайт в секунду. ваш код после загрузки всех данных в озу какую покажет скорость обработки всех ваших данных, предположим 100ГБ? предскажу что это близко не будут теоретически возможные 10 сек. ещё раз обращу внимание - "обработка всех данных", т.е. как минимум один раз прочитать весь объём и что там обсчитать.
25 июл 19, 15:05    [21934451]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
Андрей Игоревич, вам надо обработать за раз весь миллиард?
25 июл 19, 15:07    [21934453]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Мигалка
Member

Откуда:
Сообщений: 1244
эммм... а не кажется ли автору что тут не бд виновата - "за несколько часов даже процента не записало"
3 минуты * 60 секунд * 600МБ/с = 108ГБ - объём данных
108ГГБ / 3 часа / 3600 секунд * полпроцента = 5КБ/с
25 июл 19, 15:13    [21934463]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
vavan
Member

Откуда: Казань
Сообщений: 3365
Андрей Игоревич
попробовал записать миллиард значений в БД, за несколько часов даже процента не записало
некоторые бд/движки умеют балками оперировать, порой вполне может и тысячами (а то и десятками их) в секунду писать
25 июл 19, 15:46    [21934539]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
Мигалка, BDE залил лям записей в таблицу paradox примерно за минуту.

поля: autoinc & numeric(18, 2). numeric индексирован
25 июл 19, 15:48    [21934549]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Василий 2
Member

Откуда:
Сообщений: 700
1) SQLite из коробки умеет делать in-memory DB
2) XML тут ну вот никак не поможет, т.к. будет сделан скорее всего на тех же самых массивах и сожрет памяти еще и побольше, чем у ТС.
3) Для дин.массива структур с полями-дин.массивами особого жора памяти при расширении не будет, т.к. размер самого массива (т.е. Sizeof(elem)*Length(array)) невелик. Именно Sizeof(elem) определяет размер элемента, а не сумма размеров всех данных, на которые он ссылается. ТС, ты прикинь, может, и нет нужды что-то выдумывать
25 июл 19, 17:23    [21934639]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
Мигалка
любая не файловая бд будет быстрее, потому что кроме физических чтений-записей, будут ещё логические и "бизнеслогика" которые сожрут времени в 1000, а вероятнее и в 1000000 раз больше в самописной реализации чем собственно операции с озу.

Не понял о чем речь. Что такое "бизнеслогика"? БД быстрее складывают/умножают/возводят в степень/присваивают?
Мигалка
автор! бд будет отдавать вам данные из озу причем только те которые будут нужны вам сейчас. вам же не надо каждый миг обрабатывать все ваши десятки гигов, вам нужен какой-то срез или агрегат, а это как раз то что БД делает лучше всего. если, конечно, вы будете использовать БД как БД, а не тупое хранилище.

Десятки гигов - нет, сотни мегабайт - вполне может быть, хотя я и стараюсь такого избегать (вычислив или подготовив нужное заранее).

Мигалка
характерные скорости озу сейчас - десятки гигабайт в секунду. ваш код после загрузки всех данных в озу какую покажет скорость обработки всех ваших данных, предположим 100ГБ? предскажу что это близко не будут теоретически возможные 10 сек. ещё раз обращу внимание - "обработка всех данных", т.е. как минимум один раз прочитать весь объём и что там обсчитать.

Конкретно сейчас вопрос о 100гб не стоит (но стоял ранее), но прямое обращение к ССД в принципе переберет эти 100Гб за минуты, что бы добиться такого от БД надо быть явно не любителем, как я.

LocksmithPC
Мигалка, BDE залил лям записей в таблицу paradox примерно за минуту.
поля: autoinc & numeric(18, 2). numeric индексирован

Если вернуться к давнему вопросу о миллиардах (НЕ миллионах) значений, умнож минуту на несколько тысяч - сколько там в часах выйдет?
vavan
Андрей Игоревич
попробовал записать миллиард значений в БД, за несколько часов даже процента не записало
некоторые бд/движки умеют балками оперировать, порой вполне может и тысячами (а то и десятками их) в секунду писать
Василий 2
1) SQLite из коробки умеет делать in-memory DB
2) XML тут ну вот никак не поможет, т.к. будет сделан скорее всего на тех же самых массивах и сожрет памяти еще и побольше, чем у ТС.
3) Для дин.массива структур с полями-дин.массивами особого жора памяти при расширении не будет, т.к. размер самого массива (т.е. Sizeof(elem)*Length(array)) невелик. Именно Sizeof(elem) определяет размер элемента, а не сумма размеров всех данных, на которые он ссылается. ТС, ты прикинь, может, и нет нужды что-то выдумывать

Да понимаю я, что и БД можно достичь скорости сопоставимой со скоростью прямого чтения/доступа к диску. Но давайте будем честны, для огромных баз это потребует не базового умения работать с БД и кучу дополнительных условий. Что мне ну совсем не хочется делать. Я не программист, я пишу код для своих расчетных нужд, а подобный уровень изучения БД был бы логичен, если бы это была моя профессия.
25 июл 19, 17:44    [21934655]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 3967
LocksmithPC
Андрей Игоревич, вам надо обработать за раз весь миллиард?
Это самый интересный вопрос. На который так я и не увидел ответа.
А то если нет - то в СУБД как минимум поиск необходимого диапазона из этого миллиарда произошел бы в порядки раз быстрее, чем в цикле по массиву.
25 июл 19, 17:59    [21934672]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
YuRock
LocksmithPC
Андрей Игоревич, вам надо обработать за раз весь миллиард?
Это самый интересный вопрос. На который так я и не увидел ответа.
А то если нет - то в СУБД как минимум поиск необходимого диапазона из этого миллиарда произошел бы в порядки раз быстрее, чем в цикле по массиву.

Про миллиард сейчас не скажу, но миллион, вроде как перебирается/присваивается менее чем за секунду при работе в оперативной памяти напрямую.
Ну и опять же, на данный момент у меня полностью самодостаточное приложение, скопировал вместе с нужными файлами на любой компьютер под виндой, и работай сколько хочешь, ни прав никаких не надо, ни сервера никакие поднимать.
С БД это уже далеко не так просто (хотя вроде как есть решения, но не самые удобные).
25 июл 19, 18:28    [21934704]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
asutp2
Member

Откуда: Тюмень
Сообщений: 540
Андрюха, да делай как тебе нравится))))
25 июл 19, 19:18    [21934739]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Vlad F
Member

Откуда:
Сообщений: 871
Андрей Игоревич
YuRock
пропущено...
Это самый интересный вопрос. На который так я и не увидел ответа.
А то если нет - то в СУБД как минимум поиск необходимого диапазона из этого миллиарда произошел бы в порядки раз быстрее, чем в цикле по массиву.

Про миллиард сейчас не скажу, но миллион, вроде как перебирается/присваивается менее чем за секунду при работе в оперативной памяти напрямую.
Ну и опять же, на данный момент у меня полностью самодостаточное приложение, скопировал вместе с нужными файлами на любой компьютер под виндой, и работай сколько хочешь, ни прав никаких не надо, ни сервера никакие поднимать.
С БД это уже далеко не так просто (хотя вроде как есть решения, но не самые удобные).

Вам подсказать достаточно простые способы скоростной вставки в БД на основе FB embedded, который, к слову, можно расположить внутри каталога приложения и копировать вместе с ним, точно так же ничего не настраивая?
25 июл 19, 20:16    [21934797]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Василий 2
Member

Откуда:
Сообщений: 700
У нас коллеги оперируют блобами на SQLite в памяти в масштабах десятков гигов.
25 июл 19, 21:00    [21934820]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 58443
Блог
Андрей Игоревич
Сначала для скептиков суть:

Да какие скептики и какая суть... и так видно, что основная проблема задачи - в уровне исполнителя.

Андрей Игоревич
1. Корректно ли увеличивать массив (например самого нижнего уровня) при каждом добавлении на 1 элемент, особенно когда общий размер массива становится несколько сотен мегабайт?

Это относительно корректно, но крайне неоптимально. Примерно как сортировка пузырьком - так можно делать только тогда, когда есть железобетонная уверенность в избытке ресурсов по сравнению с задачей.

Андрей Игоревич
Если нет, то как это можно обойти, если до самого момента считывания я не могу не знать о размерах массива?

Зависит от того, как именно организовано хранение файлов, логика считывания и т. п., вариантов много. Наиболее стандартный универсальный способ - выделять с запасом, а потом корректировать. То есть, первоначально выделить десять элементов, когда считан одиннадцатый - увеличить размер до сотни, когда считан сто первый - до тысячи и т. п. После считывания последнего элемента установить точный размер.

Андрей Игоревич
2. Существуют ли способы сразу указать для всех массивов нижнего уровня их размер не перебирая.

Вопрос крайне сомнителен и непонятен, но в целом короткий ответ - нет.

Андрей Игоревич
3. Существуют ли более удобные способы работы с таким форматом данных?

Способы зависят от данных и от логики работы с ними. Единственно возможный короткий ответ - нужно, чтобы эту задачу посмотрел программист. А там может оказаться так, что данные лучше всего вообще потоково обрабатывать при считывании и нигде не хранить.
25 июл 19, 21:30    [21934838]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
Андрей Игоревич
LocksmithPC
Мигалка, BDE залил лям записей в таблицу paradox примерно за минуту.
поля: autoinc & numeric(18, 2). numeric индексирован

Если вернуться к давнему вопросу о миллиардах (НЕ миллионах) значений, умнож минуту на несколько тысяч - сколько там в часах выйдет?


Вот не похрен сколько часов по ночам ПО будет грузить данные?

выборки из этого миллиона (fRData от 0,00 до 14,00):

select
  sum(fRData)

from
  "tbResult.db"


0:0:0.127

select
  sum(fRData)

from
  "tbResult.db"

where
  fRData between 9.0 and 12.0


0:0:0.653

И есть нюанс. Данные в индексированную таблицу не заливают. Её индексируют после.

Сразу скажу, что я не фанат BDE, хотя пользую его до сих пор там-сям. Но нашему страдальцу для начала, да из Delphi, лучше его не придумать. Главное помнить про 2 Гб на таблицу.
26 июл 19, 05:20    [21934944]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
LocksmithPC
Member

Откуда:
Сообщений: 199
А вариант с внешними таблицами фаера уже был?

Развернуть данные в:

1,123456  2,345678  3,456789...


create table "ОбязательноБахнемНоПотом" external file 'D:\Database\Dbtemp\NuclearBomb\20190726-0601\Ba-bah.txt' (
  fF001 char(10),
  fF002 char(10),
  fF003 char(10),

  ...

  fEOL char(3));


insert into tbInternalTable (fField001, fField002, fField003...)
select fF001, fF002, fF003... from "ОбязательноБахнемНоПотом"

commit;
26 июл 19, 06:06    [21934947]     Ответить | Цитировать Сообщить модератору
 Re: Как корректно работать с динамическими массивами очень глубокой вложенности.  [new]
Андрей Игоревич
Member

Откуда:
Сообщений: 217
softwarer
Андрей Игоревич
Сначала для скептиков суть:

Да какие скептики и какая суть... и так видно, что основная проблема задачи - в уровне исполнителя.
Спасибо, но к чему?

softwarer
Андрей Игоревич
1. Корректно ли увеличивать массив (например самого нижнего уровня) при каждом добавлении на 1 элемент, особенно когда общий размер массива становится несколько сотен мегабайт?

Это относительно корректно, но крайне неоптимально. Примерно как сортировка пузырьком - так можно делать только тогда, когда есть железобетонная уверенность в избытке ресурсов по сравнению с задачей.
Андрей Игоревич
Если нет, то как это можно обойти, если до самого момента считывания я не могу не знать о размерах массива?

Зависит от того, как именно организовано хранение файлов, логика считывания и т. п., вариантов много. Наиболее стандартный универсальный способ - выделять с запасом, а потом корректировать. То есть, первоначально выделить десять элементов, когда считан одиннадцатый - увеличить размер до сотни, когда считан сто первый - до тысячи и т. п. После считывания последнего элемента установить точный размер.

Интересное решение, надо попробовать.

softwarer
Андрей Игоревич
2. Существуют ли способы сразу указать для всех массивов нижнего уровня их размер не перебирая.

Вопрос крайне сомнителен и непонятен, но в целом короткий ответ - нет.

А что тут непонятного. Есть, допустим, Х-массивов 3го уровня, каждый имеет A*Y - массивов 4го уровня, те, в свою очередь по B*Z массивов 5го. Можно ли сразу всем массивам задать нужный размер не пробегая по каждому? Например, часто бывает что двигаешься по файлам конструкции одного типа и уже заранее знаешь все размеры массива. В принципе предложенный выше вариант с присвоением приемлем.
Ну и совместно с предыдущим пунктом - есть ли способ задать размер массива "по умолчанию"? Ну выделил я массив высокого уровня и там сразу все массивы нижнего уровня сразу имеют начальные размеры, или всё-таки надо руками размеры прописать?

softwarer
Андрей Игоревич
3. Существуют ли более удобные способы работы с таким форматом данных?

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

Потоково работать можно только с ССД, иначе при каждом действии возникают сильные лаги. На данный момент в программе вся информация доступна мгновенно, и присутствует минимальная анимация, при работе с жестким диском (той же БД) это будет куда менее удобно.

Vlad F
Вам подсказать достаточно простые способы скоростной вставки в БД на основе FB embedded, который, к слову, можно расположить внутри каталога приложения и копировать вместе с ним, точно так же ничего не настраивая?

Спасибо, пока не надо. Для данной задачи БД избыточна. Когда возникнет необходимость работать с объемами выходящими за рамки оперативной памяти - попробую ещё раз воспользоваться БД.

LocksmithPC
Андрей Игоревич
пропущено...

Если вернуться к давнему вопросу о миллиардах (НЕ миллионах) значений, умнож минуту на несколько тысяч - сколько там в часах выйдет?


Вот не похрен сколько часов по ночам ПО будет грузить данные?

3ккк значений (вполне обычный массив данных объемного распределения значений, максимум который был у меня 60ГБ) - 50 часов.
Но к вопросу данной темы это никак не относится, это уже дела минувших или грядущих дней.
Сейчас размеры массивов исчисляются сотнями мегабайт и спокойно уживаются в оперативной памяти, при том предоставляя мгновенный доступ.

LocksmithPC
А вариант с внешними таблицами фаера уже был?
Развернуть данные в:

Так по сути с внешних таблиц это и грузится... Можно работать и напрямую с ними, просто медленно и неудобно.

К сообщению приложен файл. Размер - 139Kb
26 июл 19, 12:28    [21935248]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить