powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
25 сообщений из 315, страница 8 из 13
Как работать с очень большими масивами
    #39590814
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,
Код: pascal
1.
  p := VirtualAlloc(nil, 8 * 200000000, MEM_COMMIT, PAGE_READWRITE);


...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590820
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикVladimir Baskakov,

Отработало.
Hello, world.
4.00000000000000E+0001

В диспетчере память - 5.7 мб


Дабавим полное заполнение, for и ошибка


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure T();
var p2,p:PData;
    i :longint;
begin       
  p:=VirtualAlloc(nil,8*100000000,MEM_COMMIT ,PAGE_READWRITE); 
   
  for i:=0 to 100000000  do p^[i]:=1;
  writeln(p^[200002]);
  readln();

  VirtualFree(p,0,MEM_RELEASE);

end;


так - у меня - не падает. Фри паскалю никаких флагов не ставил, без понятия во что компилит. 8*200000000 - так - упадет.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590823
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

Никогда не пиши цифры. Лучше пиши так

Код: pascal
1.
  p := VirtualAlloc(nil, SizeOf(Real) * 200000000, MEM_COMMIT, PAGE_READWRITE);
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590824
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov8*200000000 - так - упадет.
Обычный SetLength(doubles, 200000000); прекрасно отрабатывает на XP-виртуалке с 1Gb.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590827
Kazantsev AlexeyVladimir Baskakov8*200000000 - так - упадет.
Обычный SetLength(doubles, 200000000); прекрасно отрабатывает на XP-виртуалке с 1Gb.
Чисто для чистоты эксперимента, я речь вел о двух таких массивах. :).

А вообще хз, у меня через раз нормально работает. Почему - пока не понял :).
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590836
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure T();
var p2,p:PData;
    i :longint;
begin       
  p:=VirtualAlloc(nil,8*100000000,MEM_COMMIT ,PAGE_READWRITE); 
  writeln(0);
  p2:=VirtualAlloc(nil,8*100000000,MEM_COMMIT ,PAGE_READWRITE); 
  writeln(1);   
  for i:=0 to 100000000  do p^[i]:=1;
  writeln(2);
  for i:=0 to 100000000  do p2^[i]:=1;
  writeln(p^[200002]);
  readln();

  VirtualFree(p,0,MEM_RELEASE);
  VirtualFree(p2,0,MEM_RELEASE);

end;


такой код падает при заполнении второго массива.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590845
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakov,

У меня норм отработало

Лучше сделай
Код: pascal
1.
  writeln(SIZEOF(Real));
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590847
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно еще так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
  TLargeArray<T> = record
    Items: array of array of T;
  private
    FCount: int64;
    function GetElements(n: int64): T;
    procedure SetElements(n: int64; const Value: T);
    procedure SetCount(const Value: int64);
  public
    procedure Clear;
    property Elements[n: int64]: T read GetElements write SetElements; default;
    property Count: int64 read FCount write SetCount;
  end;
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590850
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyVladimir Baskakov8*200000000 - так - упадет.
Обычный SetLength(doubles, 200000000); прекрасно отрабатывает на XP-виртуалке с 1Gb.

FPC - работает

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure T2();
var p: array of real;
    i :longint;
begin       
  SetLength(p,100000000);
  for i:=0 to 100000000-1  do p[i]:=1;
  writeln(p[200002]);
  readln();  
end;



падает
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure T2();
var p: array of real;
    i :longint;
begin       
  SetLength(p,200000000);
  for i:=0 to 200000000-1  do p[i]:=1;
  writeln(p[200002]);
  readln();  
end;


вин 7-64 - 4 гига
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590853
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик writeln(SIZEOF(Real));

я делал, 8. но у меня не делфя - раз, флаги компилятора не выставлены - два.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590855
Kazantsev AlexeyАндрей Игоревичпрограмма вылетает (правда уже без краша компилятора) с формулировкой нет доступа к какой-то там ячейке памяти
Значит где-то косячишь с индексом/обращаешься к неинициализированной переменной.

Ага, и правда косячил (забыл что динамический массив с 0 начинается), присваивал "1" и "2", вместо "0" и "1", так что конкретно эта задача решена, прошу простить за невнимательность.

Правда почему со статическим массивом не дает работать или крашится, всё равно не понятно.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590857
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичЧисто для чистоты эксперимента, я речь вел о двух таких массивах. :)
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590858
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичKazantsev Alexeyпропущено...

Обычный SetLength(doubles, 200000000); прекрасно отрабатывает на XP-виртуалке с 1Gb.
Чисто для чистоты эксперимента, я речь вел о двух таких массивах. :).

А вообще хз, у меня через раз нормально работает. Почему - пока не понял :).

Поделите массив между несколькими запусками программы - map-reduce, однако, бигдэйта.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590860
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...виртуалка с 2Gb.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590862
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичПравда почему со статическим массивом не дает работать или крашится, всё равно не понятно.
Вероятно есть ещё какие-то косяки, пока не обнаруженные ;)
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590866
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovпадает
Проверил на fpc 3.1.1. работает и под линуксом и под вайном.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590877
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyVladimir Baskakovпадает
Проверил на fpc 3.1.1. работает и под линуксом и под вайном.
у меня нет кросскомпайлера -> 64.
возможно - ограничение 32-разрядной программы.
версия 3.0.2 i386w32 ...
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590879
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Виртуалка с 2Gb и 4 массива (6.1Gb).
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590882
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir Baskakovвозможно - ограничение 32-разрядной программы
Если учесть, что по дефолту у 32-битного процесса адресное пространство всего 2Gb, то не удивительно, что при выделении таких объёмов можно легко налететь на его нехватку.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590889
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyВиртуалка с 2Gb и 4 массива (6.1Gb).Долго диском шуршало?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590891
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey(6.1Gb)
Пардон, 5.9Gb.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590892
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatДолго диском шуршало?
Неа :) Этож виртуалка, у неё хостовый кеш для дисковых операций.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597484
Это опять я.
Наверно данные вопросы можно задавать и в разделе Огнептицы, но связанны они всё с теми же большими массивами в том же Делфи, да и тут всё свои, советов надавали, теперь надо разобраться :).

В БД я понимаю почти ничего, так что сильно прошу не унижать.

В общем с разной степенью успешности попробовал разные БД и СУБД, остановился на InterBase с Firebird (а почему нет). И возникли следующие вопросы/проблемы:

Общие:
1. Какие вообще БД можно использовать без поднятия сервера для указанных выше задач (массивы с 10кккк значений)? Если БД которые не требуют вообще никакой установки на "клиентском" компьютере, ну или отделаться одним фалом типа .ддл? Просто на основном рабочем компьютере абсолютный минимум прав, а дергать админа ради установки сервера., ну такое.
2. Какие БД можно подключить к 64 битному приложению на делфи? Ну и как это сделать Огнептицей (при переключении ругается)?

По FireBird.
1. Банальный вопрос: как очистить файл БД?
Код: plsql
1.
delete from ...


удаляет значения, но не очищает базу, не знаю что там хранится (логи, резерв, история), но как очистить файл?
2. Серьёзный вопрос: запредельно медленное для моей задачи заполнение таблицы. Через процедуру в IBE массив в 500к значений заполняется единицами за 580 секунд, через прямую SQL команду за 500 секунд:
код
Код: 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.
 try
   start:=GetTickCount;
   with ibquery2 do
   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
     sql.text:=     //   'execute procedure NEW_FLUX ('+inttostr(i)+','+inttostr(j)+','+inttostr(k)+','+inttostr(l)+','+inttostr(m)+','''+inttostr(1)+''',''' + inttostr(1)+ ''')';
       'insert into flux ("Кампания","Время","ТВС","Слой","ТвЭл","FLUX E<1МэВ","FLUX E>1МэВ") values ('+
        inttostr(i)+','+inttostr(j)+','+inttostr(k)+','+inttostr(l)+','+inttostr(m)+','''+inttostr(1)+''',''' + inttostr(1)+ ''')';
    transaction.starttransaction;
    execSQL;
    transaction.commit;
    transaction.Active:=false;
   end;
   IBquery1.Close;
   ibquery1.Open;
   finish:=GetTickCount;
   form2.TimeLabel.Caption:=('Время заполнения: '+floattostr((finish-start)/1000)+' секунд');
  except
   if ibquery1.active then
    ibquery2.transaction.rollback;
   showmessage ('Ошибка');
  end;



Что при заполнении массива в 10кккк значений потребует всего-то 3-4 месяца. Можно, конечно, распараллелить и ждать всего-то месяц, но как-то что-то хз...
Ну и вопрос: что я делаю в данном коде не так? Как можно ускорить заполнение (ну там транзакции по другому проводить или ещё чего)?
3. Перевод числа в строку в Делфи и обратно в СУБД значительно влияет на время? Или мелочь, в сравнении с чем-то другим?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597490
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич1. Банальный вопрос: как очистить файл БД?
Удаляй файл, пересоздавай базу.
Андрей ИгоревичЧерез процедуру в IBE массив в 500к значений заполняется единицами за 580 секунд, через прямую SQL команду за 500 секунд:
Это из-за транзакций. Их стоит дергать чуть реже. Например на каждые 10 тыс строк.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39597493
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вынеси
transaction.starttransaction
и
transaction.commit
за пределы циклов.
...
Рейтинг: 0 / 0
25 сообщений из 315, страница 8 из 13
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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