powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с большими объёмами памяти
25 сообщений из 45, страница 1 из 2
работа с большими объёмами памяти
    #39474605
user_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
как можно выделить объём памяти более 2 гб?
без ключа LARGEADDRESSAWARE выделяется менее 1 гб, с ключом - 2.1 гб.
как выделять память, неважно, хоть через SetLength, хоть через VirtualAlloc.
fastmm, и т.д. не влияет (delphi 7)
какие ещё есть способы для работы с данными более 2 гб, кроме перехода на 64 бит?
все данные должны быть в памяти одновременно, для скорости работы.
по идее, для 32-битного приложения предел - 4 гб. хотелось бы иметь возможность получить хотя бы все 4 (т.е., 3 с чем-то).

В 64-bit Windows для 32-bit процесса доступно:
2ГБ и 4ГБ (если приложение компилируется с параметром IMAGE_FILE_LARGE_ADDRESS_AWARE)
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474606
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Address Windowing Extensions (AWE)
Все есть в MSDN (AWE API):

http://msdn.microsoft.com/library/en-us/memory/base/address_windowing_extensions.asp
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474607
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474610
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_aкакие ещё есть способы для работы с данными более 2 гб, кроме перехода на 64 бит?


На дворе уже пардон, 2017 год, пора бы на 64 бита перейти, если нужно с большими объемами работать.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474717
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474722
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474746
user_a, Возможно ТСу поможет эта команда

запускаем cmd и вводим bcdedit /set Increaseuserva 3072 (вместо 3072 можно ввести любое число)

Что бы вернуть все обратно нужно ввести: bcdedit /deletevalue increaseuserva
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474838
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator, мне показалось он хочет одним куском, раз упомянул SetLength.

AWE требует привилегии Lock Pages in Memory, что обычным пользователям (и даже админам) не дают. Если в системе есть куча оперативной памяти, то гораздо проще написать 64-битное приложение, благо сегодня это возможно в Delphi.

С другой стороны, проецируемые в память файлы не требуют дополнительных привилегий и могут быть сколь угодно большими (ограничены только файлом подкачки/местом на диске).
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474843
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаWWWлОдАрЕц, в 64-битной ОС смысла в этом параметре нет. 32-битным приложениям доступно 4 гигабайта.

http://www.gunsmoker.ru/2011/04/windows-spin-off.html#n7
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474847
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
GunSmokerdefecator, мне показалось он хочет одним куском, раз упомянул SetLength.

user_aкак выделять память, неважно, хоть через SetLength, хоть через VirtualAlloc.

GunSmokerAWE требует привилегии Lock Pages in Memory, что обычным пользователям (и даже админам) не дают.

Не очень ясно про этот момент, так как у меня до сих пор работает такая софтина под WinXP и Win7 без проблем, писаная ещё в 2012-м году на D7.

GunSmokerЕсли в системе есть куча оперативной памяти, то гораздо проще написать 64-битное приложение, благо сегодня это возможно в Delphi.
Конечно, проще. Но если есть определённые ограничения - например, переход на новую версию Delphi невозможен - то приходится выкручиваться на том, что есть.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474856
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
А, сейчас поглядел в код.
Я там сам пытаюсь эту привилегию установить.

Код: 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.
{ получение или возвращение привилегий на блокировку физических страниц }
function SetLockPagesPrivilege(Process: THANDLE; Enable: Boolean): Boolean;
const
     SE_LOCK_MEMORY_NAME = 'SeLockMemoryPrivilege';
type
    DWORDPTR = ^DWORD;
var
   Token: THANDLE;
   Info: TTokenPrivileges;
begin
     // открыть токен
     Result := OpenProcessToken(Process, TOKEN_ADJUST_PRIVILEGES, Token);
     if not Result then Exit;

     try
        // enable или disable
        Info.PrivilegeCount := 1;
        if Enable then
          Info.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
        else
          Info.Privileges[0].Attributes := 0;

        // получить LUID
        Result := LookupPrivilegeValue(nil, SE_LOCK_MEMORY_NAME, Info.Privileges[0].Luid);
        if not Result then Exit;

        // привилегии
        Result := AdjustTokenPrivileges(Token, False, Info, 0, PTokenPrivileges(nil)^, DWORDPTR(nil)^);
        if not Result then Exit;

        Result := GetLastError = ERROR_SUCCESS;
     finally
       CloseHandle(Token);
     end;  
end;

{ резервирование физической памяти (вернет 0, если неудачно) }
function AllocPhysicalMemory(Size: LongWord): LongWord;
var
   PageCount: LongWord;
   MemoryItem: PMemoryItem;
begin
     Result := 0;

     if not SetLockPagesPrivilege(GetCurrentProcess, True) then Exit;

     PageCount := Size div PageSize;
     if Size mod PageSize <> 0 then Inc(PageCount);

     MemoryItem := AllocMem(8 + PageCount * SizeOf(LongWord));
     if MemoryItem = nil then Exit;

     try
        { резервирование физической памяти }
        MemoryItem.PageCount := PageCount;
        if not AllocateUserPhysicalPages(GetCurrentProcess, PageCount, @MemoryItem.Pages[0])
         then Exit;

        { проверка, все ли страницы зарезервированы }
        if PageCount <> MemoryItem.PageCount then
         begin
              FreeUserPhysicalPages(GetCurrentProcess, PageCount, @MemoryItem.Pages[0]);
              Exit;
         end;

        Result := LongWord(MemoryItem);
     finally
       if Result = 0 then FreeMem(MemoryItem);
     end;
end;

...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474876
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator, ну так посмотри, что там с привилегиями-то. У меня, к примеру, всюду AllocateUserPhysicalPages завершается с ERROR_PRIVILEGE_NOT_HELD.

P.S. Ты же понимаешь, что AWE, фактически, отключает paging и поэтому предназначен для приложений-серверов, которые запускаются на машине, специально выделенной исключительно для работы этого приложения? Вроде SQL-сервера.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474877
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorЯ там сам пытаюсь эту привилегию установить.ЕМНИП, если в политиках нет разрешения на "закрепление страниц", то процесс не сможет установить/включить эту привилегию. А по-умолчанию она вроде отключена, т.е. нужны доп. действия со стороны администратора.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474900
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Фик его знает, можно подебажить, но софтина работает же как-то
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474981
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А меня вот интересует вопрос - а назачем 4 и больше Гб в память пихать?
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474988
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMaster,

Для скорости. Разве есть еще варианты?
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39474997
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user_a,

Для 32 бит и одновременно никак. Но можно организовать большой файл и мапить из него куски. Ведешь условно говоря кеш, где учитываешь какие части маплены и куда и пересчитываешь свой большой условный указатель в номер куска и в физическое смещение внутри этого куска, получаешь текущий физический адрес. Если данные расположить относительно удачно, чтобы было много попаданий в мапленные куски, то может и не слишком тормознет.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476137
user_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
сделал двухмерный массив, вместо одномерного. выделяются несколько больших кусков, а при обращении пересчитывается одномерный указатель в двухмерный. так можно выделить где-то до 3-х гб. до конца - не пробовал. если уж не будет хватать, то, может, и придётся думать о переходе на 64 бит.
на самом деле, даже на пересчёте указателя из одномерного в двухмерный, теряется производительность - процентов 10, но всё-таки.
там не просто линейный цикл, который можно бы было заменить на два вложенных цикла, а иногда возможно чтение из произвольного места, поэтому приходится пересчитывать указатель на каждой итерации.
к тому же, если нужно обратиться к предыдущему элементу массива, а текущий - является первым (нулевым) элементом в очередном "куске", то для получения предыдущего - недостаточно отнять 1, а он должен быть последним элементом в предыдущем "куске".
помня о не всегда линейном доступе, значения с предыдущей итерации не всегда можно запомнить.
даже пробовал, общий указатель - integer, и из него, предположим, 25 бит использовать на внутренний массив, а 6 - на внешний, тогда можно получать из указателя сразу 2 значения, но получилось в несколько раз медленнее.
делал так:
inner:=a and $1FFFFFF;
outer:=(a shr 25) and $3F;
может, бинарные операции - слишком медленные, либо я чего-то не понимаю.

насчёт 64 бит - помня о том, сколько занимают новые версии delphi, как-то не хочется. если новая версия весит в 10, к примеру, раз больше (а на самом деле, ещё больше), значит, в ней, что, в 10 раз больше функций? значит, эффективность занимаемого пространства - сильно уменьшилась.
предположим, взять delphi... 7, которая занимает, там, 300 метров, и позволяет писать законченные приложения, или новые версии, которые - несколько Гб. если оставить разработку только для Win32, вот что там занимает место? новые компоненты? и во сколько они раз больше? и всё это занимает код? это сколько же нужно кода - тогда можно бы было вместить среды разработки для нескольких различных архитектур в то же самое место, а не в "ещё больше".
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476147
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двумерный массив логично было бы обрабатывать двумя циклами.

outer:=a shr 25; //это лишнее and $3F;
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476175
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще в порядке извращения:

На 64 битной OS каждый процесс может получить эти самые 2-3 гига.

Создай кластер из несколькиз 32 битных процессов.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476182
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Кластерный менеджер памяти напишешь сам. ;)
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476195
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
rgreatrgreat,

Кластерный менеджер памяти напишешь сам. ;)
самый быстрый в мире (с)
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476202
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecator,

Понятно дело что самый быстрый. Он же один такой будет. :)
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476206
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Майнеры потянулись? )
По поводу 'зачем'? Случаи всякие бывают. 8 гиг, занимаемые станциями, у нас - рутина. 64 бита, само собой.
...
Рейтинг: 0 / 0
работа с большими объёмами памяти
    #39476432
user_a
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а под 64 бит же тоже может не оказаться непрерывного куска в несколько ГБ? тогда в чём разница, именно в этой части? т.е., всё равно придётся создавать массив "по частям".

а ещё в delphi переменная не может быть более 2 гб. так что "одним куском" и так бы не получилось.
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с большими объёмами памяти
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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