powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
25 сообщений из 315, страница 7 из 13
Как работать с очень большими масивами
    #39590648
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревичrgreat,

Что-то не особо оно работает. В итоге делфи завис и только убивать через диспетчер. Памяти должно хватать.


НяшикЭто баги компилятора

И как быть?

арендовать виртуальную машину с дохренищей памяти и поставить там языки с библиотеками для обработки больших массивов ((((

а пока попробуйте использовать для выделения памяти
https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa366887(v=vs.85).aspx
VirtualAlloc
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590658
makhaonда, может в этом и проблема. что памяти не хватает. что бы кусок выделить целиком. у меня схавало без вопросов.
скорее всего многомерные массивы придётся делать.
Ну 16 ГБ оперативы и столько же в подкачке. Сколькож ему надо? В диспетчере информация неактуальная какая-то.

При том что любопытно, сделал увеличение массива по кнопке - работает, а не при инициализации, заполнил рандомами - работает (на удивление быстро забивает 400 миллионов значений).

Возвращаюсь к своим "записям", делаю вместо двух переменных динамический массив, по кнопке выполняю SetLength(array, 2), вроде бы работает, подключаю процедуру для работы с массивом - программа вылетает (правда уже без краша компилятора) с формулировкой нет доступа к какой-то там ячейке памяти. При том программа вылетает не в момент увеличения массива, и не в момент первого обращения к нему, а момент инициализации процедуры в котором должны обращаться к массиву.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590666
Vladimir Baskakov,

Да не такие уж это даже и большие массивы, чтоб так с ними морочится, в пространственных расчетах массивы по сотни гигабайт бывают. Правда хз как там их обрабатывают. Хотя и у программ для таких расчетов обычно жесткие требования к оперативе 64-128гб.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590696
Фотография LocksmithPC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич, с самого начала вам предлагали БД. После можно было обрабатывать данные целиком или засасывать кусками в память и перекручивать их там.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590707
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНу 16 ГБ оперативы и столько же в подкачке. Сколькож ему надо? В диспетчере информация неактуальная какая-то.В общем случае 32-бит процессу из этих 16 гигов достается лишь 2 гига. Остальное зависит от фрагментации. Там может быть свободно более 1 гиг, но иза фрагментации, не быть свободного куска нужного размера. И попытка его выделить потерпит неудачу
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590737
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
200000000 это всего лишь 200 байт мегабайт ... Оперативной памяти у меня к примеру должно хватит 100%


Та и под 64 битным компилятором тоже не работает данный код

...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590738
LocksmithPC,

БД это хорошо, я даже поковырялся немного, но пока отказался от данного способа из-за слишком большого количества телодвижений ради каждой операции. Возможно позже опять к нему вернусь. Тут то вроде массив куда меньший изначального, всего около 400 миллионов значений по 4 байта (real) - по идее всего-то 1-3 гб памяти. Мучать БД ради такого не хотелось бы.


white_niggerВ общем случае 32-бит процессу из этих 16 гигов достается лишь 2 гига. Остальное зависит от фрагментации. Там может быть свободно более 1 гиг, но иза фрагментации, не быть свободного куска нужного размера. И попытка его выделить потерпит неудачу

Да вроде и процессор и система 64, и компилятор на 64 убедил работать. Как его (компилятор, приложение) убедить отжать в памяти более 2гБ сразу, не фрагментируя данные? Куча программ под себя и по 100ГБ забирает оперативы, и не жалуется.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590741
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревичпрограмма вылетает (правда уже без краша компилятора) с формулировкой нет доступа к какой-то там ячейке памяти
Значит где-то косячишь с индексом/обращаешься к неинициализированной переменной.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590745
Няшик200000000 это всего лишь 200 байт мегабайт ... Оперативной памяти у меня к примеру должно хватит 100%


Та и под 64 битным компилятором тоже не работает данный код


Ну реал вроде 4(6?) байта, так что такие 800 где-то 800 мб, но всё равно не так уж и много, чтоб не хватало памяти.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590747
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerНужны непрерывные участки, а таких может и не быть (особенно в W10 FCU)
Непрерывные участки в адресном пространстве процесса. Как FCU на это может повлиять?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590750
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичНу реал вроде 4(6?) байта
Довольно давно уже Real = Double.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590751
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

О да.. Я помножить забыл 200 000 000 * 8 байт = 1600 Мбайт

8 он байт
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590761
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyКак FCU на это может повлиять?По идее не должен. Хотя в FCU мелкомягкие накосячили с выделением памяти - сильная фрагментация. Может косвенно как-нить и влияет
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590765
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ИгоревичКак его (компилятор, приложение) убедить отжать в памяти более 2гБ сразу, не фрагментируя данные?
Код для x64:
Код: pascal
1.
2.
3.
4.
5.
var bts : TBytes;
begin
 SetLength(bts, 1024 * 1024 * 1024 * int64(3)); // Выделяется 3Gb
 writeln(Length(bts));
end;


Прекрасно работает на виртуальной машине с 1Gb RAM.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590771
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
program Hello;
uses Windows;

Type
 TData = array[0..200000000] of Real;
 PData = ^Tdata;

procedure T();
var p:PData;
begin       
  p:=VirtualAlloc(nil,4*200000000,MEM_COMMIT ,PAGE_READWRITE); 
  p^[200000]:=10;
  p^[200001]:=30;
  p^[200002]:=p^[200001]+p^[200000];
  writeln(p^[200002]);
  VirtualFree(p,0,MEM_RELEASE);

end;


begin
  writeln ('Hello, world.')   ;
  T();
  readln();
end.




Делфей нет. Но под FPC вроде отработало. я уж правда наизусть не помню, сколько байт в Real (((
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590772
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerХотя в FCU мелкомягкие накосячили с выделением памяти - сильная фрагментация.
У дельфей же свой ММ, ему системная фрагментация побоку.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590776
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич,

авторНу 16 ГБ оперативы и столько же в подкачке. Сколькож ему надо? В диспетчере информация неактуальная какая-то.

если бы с памятью было всё так просто
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590781
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyУ дельфей же свой ММ, ему системная фрагментация побоку.Ну я как бы в курсе :) Он один фиг поверх системного аллокатора, а если тот может глючить... Я не настаиваю, просто в случае FCU ничему не удивляюсь
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590785
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

думаешь, что мм прямо с железом работает?

посмотри хотя бы тот же fastmm:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
{Allocates a new sequential feed medium block pool and immediately splits off a
 block of the requested size. The block size must be a multiple of 16 and
 medium blocks must be locked.}
function AllocNewSequentialFeedMediumPool(AFirstBlockSize: Cardinal): Pointer;
var
  LOldFirstMediumBlockPool: PMediumBlockPoolHeader;
  LNewPool: Pointer;
begin
  {Bin the current sequential feed remainder}
  BinMediumSequentialFeedRemainder;
  {Allocate a new sequential feed block pool}
  LNewPool := VirtualAlloc(nil, MediumBlockPoolSize,
    MEM_COMMIT{$ifdef AlwaysAllocateTopDown} or MEM_TOP_DOWN{$endif}, PAGE_READWRITE);
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590789
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_nigger,

Как я понимаю, VirtualAlloc может просто не вернуть кусок нужного размера из-за фрагментации.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590793
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexeywhite_niggerНужны непрерывные участки, а таких может и не быть (особенно в W10 FCU)
Непрерывные участки в адресном пространстве процесса. Как FCU на это может повлиять?

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

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

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


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

32 бит



64 бит


Протестируй у себя
Код: 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.
program Project1;

uses Windows;

Type
  TData = array [0 .. 200000000] of Real;
  PData = ^TData;

procedure T();
var
  p: PData;
  I: Integer;
begin
  p := VirtualAlloc(nil, 4 * 200000000, MEM_COMMIT, PAGE_READWRITE);

  for I := 1 to 200000000 - 1000 do
    p^[I] := I;

  writeln(p^[I - 10]);
  VirtualFree(p, 0, MEM_RELEASE);

end;

begin
  writeln('Hello, world.');
  T();
  Readln;

end.

...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590804
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
white_niggerОн один фиг поверх системного аллокатора, а если тот может глючить...
Хочешь сказать, что на FCU глючит VirtualAlloc?

makhaonКак я понимаю, VirtualAlloc может просто не вернуть кусок нужного размера из-за фрагментации
Ты бы ещё понимал о чём говоришь... Чтобы VirtualAlloc обломался из-за фрагментации, у тебя в процессе должны быть зарезервированы участки памяти по множеству адресов, между которыми не находится достаточно свободного места. А того пространства у тебя 8TB.
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590807
Vladimir Baskakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p:=VirtualAlloc(nil,8*200000000,MEM_COMMIT ,PAGE_READWRITE);

а так - сдохло.

вот так
p:=VirtualAlloc(nil,4*200 000 000,MEM_COMMIT ,PAGE_READWRITE);
p2:=VirtualAlloc(nil,4*200000000,MEM_COMMIT ,PAGE_READWRITE);

работает......
в общем, там по адресации надо посмотреть. и на крайняк резать на куски.
в принципе, ну два куска. Ну что поделать?
...
Рейтинг: 0 / 0
Как работать с очень большими масивами
    #39590813
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyА того пространства у тебя 8TB
... с IMAGE_FILE_LARGE_ADDRESS_AWARE
...
Рейтинг: 0 / 0
25 сообщений из 315, страница 7 из 13
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как работать с очень большими масивами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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