Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / работа с большими объёмами памяти / 25 сообщений из 45, страница 1 из 2
20.06.2017, 10:08:32
    #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
20.06.2017, 10:11:01
    #39474606
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с большими объёмами памяти
Address Windowing Extensions (AWE)
Все есть в MSDN (AWE API):

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


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

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

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

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

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

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

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

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

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

GunSmokerЕсли в системе есть куча оперативной памяти, то гораздо проще написать 64-битное приложение, благо сегодня это возможно в Delphi.
Конечно, проще. Но если есть определённые ограничения - например, переход на новую версию Delphi невозможен - то приходится выкручиваться на том, что есть.
...
Рейтинг: 0 / 0
20.06.2017, 15:45:31
    #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
20.06.2017, 15:59:27
    #39474876
GunSmoker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с большими объёмами памяти
defecator, ну так посмотри, что там с привилегиями-то. У меня, к примеру, всюду AllocateUserPhysicalPages завершается с ERROR_PRIVILEGE_NOT_HELD.

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

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

Для 32 бит и одновременно никак. Но можно организовать большой файл и мапить из него куски. Ведешь условно говоря кеш, где учитываешь какие части маплены и куда и пересчитываешь свой большой условный указатель в номер куска и в физическое смещение внутри этого куска, получаешь текущий физический адрес. Если данные расположить относительно удачно, чтобы было много попаданий в мапленные куски, то может и не слишком тормознет.
...
Рейтинг: 0 / 0
22.06.2017, 13:06:05
    #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
22.06.2017, 13:19:41
    #39476147
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
работа с большими объёмами памяти
Двумерный массив логично было бы обрабатывать двумя циклами.

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

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

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

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

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

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

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


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