powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
25 сообщений из 315, страница 10 из 13
Как работать с очень большими масивами
    #39597769
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и, да, я бы выбрал SQLite для мелких однопользовательских задач. если лицензионность индифферентна, то DISQLite для доступа. там, кстати, есть демка с генерацией БД (text+text+int+float+float+float+float+float+float), на моем среднем компе скорость 200к/сек строк генерации рандомных данных и вставки их в новую базу на SSD. но при прямых руках таких скоростей и с Firebird достичь можно
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597771
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то делал массовую вставку примитивных по структуре записей в библиотеке UIB

Как ни противно было признаваться - сделать в памяти текстовый скрипт из мнооооожества строк INSERT .... VALUES( ... ) и скормить его Firebird'y оказалось заметно быстрее, чем препарированная кверь в цикле с изменением параметров (ParamByName не использовался, параметры заполнялись по номеру). Такие дела....

Андрей ИгоревичКак раз типизированными файлами сейчас и реализовано
Ну и хорошо, зачем их обязательно внутрь SQL засасывать, они от этого только больше в размере станут.
Но если очень хочется - почитай про EXTERNAL TABLE - возможно задачу распарсить файл - если тструктура действительно простая и однородная - можно будет переложить на сам Firebird

INSERT INTO REAL_TABLE(.....) SELECT * FROM EXTERNAL_TABLE

А вообще я бы тебе советовал перейти в форум про Firebird, описать задачу, объёмы данных ,как част ои какмного пишете читаете, и возможно тебе просто скажут, что SQL не для того.

PS. насчет транзакций.... Ну вообще-то вызывать транзакции слишком часто ( или наоборот слишком редко, но это в меньшей степени ) - это азбучный способ затормозить сервер.

http://www.ibase.ru/dontdoit/
http://www.ibase.ru/45-ways-to-improve-firebird-performance-russian/
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597773
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00ch,

если новое начинать - то лучше mORMot - можно начать с SQLite ,а если не понравистя (данных слишком много, например, то переключиться в не-SQL плоские файлы

Кстати, был ещё NexusDB - табличные файлы со встроенным SQL-языком написанные целиком на Delphi
Но насколько это надёжно - мнения были разные.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597776
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDSoft...Патамучта в состоянии искаропки эта окаменелость с FB в режиме Embedded Server работать почему-то не желает ... и один из участников приводил свой вариант возможного патча.
VDSoft...поищите.по форуму...
Ты придумал, а мне искать?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597780
VDSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Покажешь класс подключения/работы непатченного IBX с Embedded FB Server и можешь твёрдо рассчитывать на мои извинения. В противном случае рассчитываю на них уже с вашей стороны..
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597785
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDSoftчччД,

Покажешь класс подключения/работы непатченного IBX с Embedded FB Server и можешь твёрдо рассчитывать на мои извинения. В противном случае рассчитываю на них уже с вашей стороны..
"А слабо Вольдемару в бассейн нырнуть?" - (с).

У меня работает. Если у тебя проблемы - спрашивай, не стесняйся. Только конкретные вопросы задавай.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597790
VDSoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД,

Ну работает и работает, может научите кого, если попросят. У меня тож работает в частном патче IBX. А вопросов, если заметите, я не имел уже с самого начала и не могу понять этого вашего упорного выпрыгивания из штанов.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597796
Что-то всего по написали, половину я не понял (о чем спорили вообще не понял).

Вы лучше по поводу оптимизации этого 21170870 кода подскажите :), если в хотя бы 3-10 раз его ускорить, то уже норм будет. Ну там сразу по 5 команд одной строкой выполнять или ещё чего.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597798
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич...если в хотя бы 3-10 раз его ускорить, то уже норм будет. Ну там сразу по 5 команд одной строкой выполнять или ещё чего.

Вместо "Insert into" пишешь "Execute block". За одно обращение задаешь кучу значение параметров, для нескольких Insert:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
execute block (
    PI1 int = :PI1,
    PJ1 int = :PJ1,
    PK1 int = :PK1,

    PI2 int = :PI2,
    PJ2 int = :PJ2,
    PK2 int = :PK2,

    PI3 int = :PI3,
    PJ3 int = :PJ3,
    PK3 int = :PK3)
as
begin
  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI1, :PJ1, :PK1);

  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI2, :PJ2, :PK2);

  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI3, :PJ3, :PK3);
end
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597810
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я странной мыслью поделюсь - а может куски этих больших массивов в blob-ах хранить?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597814
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЯ странной мыслью поделюсь - а может куски этих больших массивов в blob-ах хранить?

Тогда и СУБД никакая не нужна - типизированный файл и все.

ТС хочет доступ по индексам массива.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597835
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичКак раз типизированными файлами сейчас и реализовано. Но стандартные "File of record" больше двух гигов (NTFS, если что) тоже вылетают с ошибкой...


Это наверняка решается одной строкой. Покажи код, сразу ошибка найдется.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597854
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДVladimir BaskakovЯ странной мыслью поделюсь - а может куски этих больших массивов в blob-ах хранить?

Тогда и СУБД никакая не нужна - типизированный файл и все.

ТС хочет доступ по индексам массива.

По индексу можно находить большой кусок данных..... а не одно число.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598097
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичЧто-то всего по написали, половину я не понял (о чем спорили вообще не понял).

Вы лучше по поводу оптимизации этого 21170870 кода подскажите :), если в хотя бы 3-10 раз его ускорить, то уже норм будет. Ну там сразу по 5 команд одной строкой выполнять или ещё чего.

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

Обрамление транзакций start/commit, должно быть через примерно 10000-20000 инсертов. То есть не на каждый инсерт, но и миллион инсертов за одну транзакцию тоже не рекомендуют.

Разрабатывать (и заполнять БД) можно на сервере на своем компе, а если переносить на другой комп для работы, можно пользоваться embedded версией firebird. там не сервер, а просто копирование нескольких файлов.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598098
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir BaskakovЯ странной мыслью поделюсь - а может куски этих больших массивов в blob-ах хранить?не надо
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598159
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VDSoftпредложенный выше вариант обращения сразу по сохранённым указателям все равно д.б. Самым быстрымя вообще не понял как оно у него стало медленнее parambyname возможно внешние тормоза так круто перекрыли
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598166
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vavan,
может, он тест запускал параллельно с просмотром видео.
Или однократно.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598174
чччДАндрей Игоревич...если в хотя бы 3-10 раз его ускорить, то уже норм будет. Ну там сразу по 5 команд одной строкой выполнять или ещё чего.

Вместо "Insert into" пишешь "Execute block". За одно обращение задаешь кучу значение параметров, для нескольких Insert:

код образец
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
execute block (
    PI1 int = :PI1,
    PJ1 int = :PJ1,
    PK1 int = :PK1,

    PI2 int = :PI2,
    PJ2 int = :PJ2,
    PK2 int = :PK2,

    PI3 int = :PI3,
    PJ3 int = :PJ3,
    PK3 int = :PK3)
as
begin
  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI1, :PJ1, :PK1);

  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI2, :PJ2, :PK2);

  insert into MY_TABLE (FIELD_I, FIELD_J, FIELD_K)
  values (:PI3, :PJ3, :PK3);
end



Попробовал данный вариант, ничего не получилось :). Вообще код выглядит ужасно, мой чувство прекрасного горько плачет.

мой код
Код: 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.
  try
   start:=GetTickCount;
   ibquery2.transaction.starttransaction;

  // fPn:= ibquery2.ParamByName('Pn');
   with ibquery2 do
    begin
      sql.text:=
     //  'insert into flux ("Кампания","Время","ТВС","Слой","ТвЭл","FLUX E<1МэВ","FLUX E>1МэВ") values (:Pi, :Pj, :Pk, :Pl, :Pm, 1, 1)';
    'execute block ('+
    'PI1 int = :PI1, '+
    'PJ1 int = :PJ1, '+
    'PK1 int = :PK1, '+
    'Pl1 int = :Pl1, '+
    'Pm1 int = :Pm1, '+

    'PI2 int = :PI2, '+
    'PJ2 int = :PJ2, '+
    'PK2 int = :PK2, '+
    'Pl2 int = :Pl2, '+
    'Pm2 int = :Pm2, '+

    'PI3 int = :PI3, '+
    'PJ3 int = :PJ3, '+
    'PK3 int = :PK3, '+
    'Pl3 int = :Pl3, '+
    'Pm3 int = :Pm3) '+

   ' as              '+
   '  begin          '+
   '   insert into flux ("Кампания","Время","ТВС","Слой","ТвЭл","FLUX E<1МэВ","FLUX E>1МэВ")'+
   '   values (:PI1, :PJ1, :PK1, :Pl1, :Pm1, 1, 1);                      '+
   '   insert into flux ("Кампания","Время","ТВС","Слой","ТвЭл","FLUX E<1МэВ","FLUX E>1МэВ")'+
   '   values (:PI2, :PJ2, :PK2, :Pl2, :Pm2, 1, 1);                      '+
   '   insert into flux ("Кампания","Время","ТВС","Слой","ТвЭл","FLUX E<1МэВ","FLUX E>1МэВ")'+
   '   values (:PI3, :PJ3, :PK3, :Pl3, :Pm3, 1, 1);                      '+
   '  end  ';

     Prepare;

   fPi1:= ibquery2.ParamByName('Pi1');
   fPj1:= ibquery2.ParamByName('Pj1');
   fPk1:= ibquery2.ParamByName('Pk1');
   fPl1:= ibquery2.ParamByName('Pl1');
   fPm1:= ibquery2.ParamByName('Pm1');

   fPi2:= ibquery2.ParamByName('Pi2');
   fPj2:= ibquery2.ParamByName('Pj2');
   fPk2:= ibquery2.ParamByName('Pk2');
   fPl2:= ibquery2.ParamByName('Pl2');
   fPm2:= ibquery2.ParamByName('Pm2');

   fPi3:= ibquery2.ParamByName('Pi3');
   fPj3:= ibquery2.ParamByName('Pj3');
   fPk3:= ibquery2.ParamByName('Pk3');
   fPl3:= ibquery2.ParamByName('Pl3');
   fPm3:= ibquery2.ParamByName('Pm3');

     for i := 1 to 3 do
      for j := 1 to 2 do
       for k := 1 to 163 do
        for l := 1 to 60 do
          for m := 1 to 10 do
            begin
              fPi1.AsInteger:= i;
              fPj1.AsInteger := j;
              fPk1.AsInteger:= k;
              fPl1.AsInteger := l;
              fPm1.AsInteger := m;

              fPi2.AsInteger:= i;
              fPj2.AsInteger := j;
              fPk2.AsInteger:= k;
              fPl2.AsInteger := l;
              fPm2.AsInteger := m+10;

              fPi3.AsInteger:= i;
              fPj3.AsInteger := j;
              fPk3.AsInteger:= k;
              fPl3.AsInteger := l;
              fPm3.AsInteger := m+20;
              execSQL;
            end;
    end;

   //  ibquery2.
    ibquery2.transaction.commit;
    ibquery2.transaction.Active:=false;

   IBquery1.Close;
   ibquery1.Open;
   finish:=GetTickCount;
   form2.TimeLabel.Caption:=('Время заполнения: '+floattostr((finish-start)/1000)+' секунд');

  except
   if ibquery1.active then
    ibquery2.transaction.rollback;
   showmessage ('Ошибка');
  end;

Такая вот ошибка выходит на Prepare; , версия FB сервера - 2.5:


Но "вообще" данный вариант мне чисто эстетически что-то не очень :).
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598184
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты в IBEpert сей EB испытывал?
Начни с него, с одного insert, потом добавляй.
Может, в ibx глюк. А может, в FB. А может, в твоём коде. Искать надо.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598188
чччДАндрей ИгоревичКак раз типизированными файлами сейчас и реализовано. Но стандартные "File of record" больше двух гигов (NTFS, если что) тоже вылетают с ошибкой...

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

S.G.Андрей Игоревич...
Попробуйте разделить исходные данные на 2-3 части, и запускать несколько клиентских приложений с разных компов, или на крайний случай с одного, для заполнения одной и той же БД. Если затычка в предварительной подготовке данных в клиентском приложении, и сервер сейчас "простаивает", то при таком подходе может получиться быстрее (скажем загрузить больше ядер/потоков компюьтера).

Обрамление транзакций start/commit, должно быть через примерно 10000-20000 инсертов. То есть не на каждый инсерт, но и миллион инсертов за одну транзакцию тоже не рекомендуют.

Разрабатывать (и заполнять БД) можно на сервере на своем компе, а если переносить на другой комп для работы, можно пользоваться embedded версией firebird. там не сервер, а просто копирование нескольких файлов.
Ну в контексте данной задачи, это уже не костыль, это целая инвалидная коляска. А многозадачность в виде нескольких потоков в одном приложении чтоль не работает с БД? Но в распаралеливании есть сложность придумывания алгоритма распаралеливания (тавтология блин), мнеж в итоге не единицами надо всё заполнять, и по факту размеры массивов не известны, указанный в самом начале - максимально возможный вариант. Если в несколько потоков работать с БД можно, то попробую.

Обрамление транзакций start/commit - в принципе сработало даже на 20ккк значений при расположении перед и после цикла, но думаю закину счетчик и "обрамление" буду выполнять раз в 10к инсертов, не сложно.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598192
vavanVDSoftпредложенный выше вариант обращения сразу по сохранённым указателям все равно д.б. Самым быстрымя вообще не понял как оно у него стало медленнее parambyname возможно внешние тормоза так круто перекрыли
Ну яж написал - в порядке погрешности. У меня вон сейчас заполнение, случайно запущенное за 20 сек выполнилось, хотя вчера за 30 было. Может ССДшник тупит, может кешь у ССДшника кончился (у М2 там как-то хитро, есть супербыстрый кеш, есть остальная память помедленней), может процесс какой решил не делится процессорной мощностью. Просто заметного прироста не заметил.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598204
чччДТы в IBEpert сей EB испытывал?
Начни с него, с одного insert, потом добавляй.
Может, в ibx глюк. А может, в FB. А может, в твоём коде. Искать надо.
В ИБ не пробовал, я не очень понимаю синтаксис [(<inparams>)] этого, точнее этого:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    PI1 int = :PI1,
    PJ1 int = :PJ1,
    PK1 int = :PK1,

    PI2 int = :PI2,
    PJ2 int = :PJ2,
    PK2 int = :PK2,

    PI3 int = :PI3,
    PJ3 int = :PJ3,
    PK3 int = :PK3


В мануале всякие не очень понятные примеры
Код: plsql
1.
2.
execute block (smallest int = ?, largest int = ?)
(pass1 VARCHAR(255) = :pass1


Надо, видимо, глубже закапываться.

Количество инсертов влияет только на цифру после "сдвига" (offset).
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598205
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не очень понимаю синтаксис [(<inparams>)]> - внешние имена, внутренние имена... :)
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598233
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Код: pascal
1.
"Кампания","Время","ТВС","Слой","ТвЭл"



ой, ё....

я надеюсь, рядом с реалдьными ВВЭРами этой программы не будет...
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39598242
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

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


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