Вниз
Скачать: CL | DM;

Запись чисел по указанному адресу   Найти похожие ветки 

← →
$Hic0 ©   (2003-02-17 12:46) [0]

День добрый!
У меня вопрос :)... Я работаю с большими массивами, над которым совершается множество операций. Работаю в WINXP. Запустив Диспетчер задач ужаснулся... моя программа (и конечно все данные) засовываются в своп файл, который раздувается до невероятных размеров, хотя при этом физическая память по большей части свободна... То что массивы чисел хранятся в свопе, а не в памяти, существенно замедляет работу программы. Думал, как можно этого избежать, попробовал функцию VirtualAlloc. Память выделилась, именно столько сколько мне надо (зарезервировалась), теперь собственно вопрос, как теперь запихать в эту память массив целых чисел... память выделяю, следующим образом:

p:=nil;
p:=VirtualAlloc(nil,SpinEdit1.Value,MEM_RESERVE,PAGE_READWRITE);
If p<>nil then ShowMessage("Память выделена") else ShowMessage("Фиг вам :)");

И что дальше? Заранее спасибо


← →
Hint ©   (2003-02-17 12:52) [1]

Попробуй параметр PAGE_NOCACHE. Только осторожно и внимательно прочитав справку


← →
MBo ©   (2003-02-17 12:59) [2]

ты получил указатель на область памяти, приведи его к типу своего массива (например, PByteArray) и работай.


← →
REA ©   (2003-02-17 13:10) [3]

Вопрос в догонку: у меня тоже приличные массивы (иногда до гигабайта, но чаще 5-20М). Насколько эффективнее использовать VirtualAlloc чем GetMem или динамические массивы?


← →
$Hic0 ©   (2003-02-17 13:16) [4]

MBo, а можно немного, саму малость попобдробнее, просто никогда с этим не сталкивался


← →
MBo ©   (2003-02-17 13:18) [5]

var p:pbytearray;

p:=VirtualAlloc(nil,SpinEdit1.Value,MEM_RESERVE,PAGE_READWRITE);
p[3]:=5;


← →
$HiC0 ©   (2003-02-17 13:24) [6]

Спасибо, я делал практически так-же, но выдается ран-тайм ошибка именно на строке p[3]:=5; :(. Аксес виолатион. Если-бы дело касалось дин массивов я бы понял что это из-за того что не задан его размер, а здесь, ничего понять не в силах


← →
REA ©   (2003-02-17 13:31) [7]

А VirtualLock не надо делать? Я что то подзабыл. Там как то хитро выделяется адрес, который надо залочить, чтобы получить другой адрес.

// Try to allocate the memory.

lpvAddr = VirtualAlloc(NULL, dwPageSize,
MEM_RESERVE | MEM_COMMIT,
PAGE_READONLY | PAGE_GUARD);

if(lpvAddr == NULL) {
printf("VirtualAlloc failed. Error: %ld\n",
GetLastError());
return 1;

} else {
fprintf(stderr, "Committed %lu bytes at address %lp\n",
dwPageSize, lpvAddr);
}

// Try to lock the committed memory. This fails the first time because
// of the guard page.

bLocked = VirtualLock(lpvAddr, dwPageSize);
if (!bLocked) {
fprintf(stderr, "Cannot lock at %lp, error = 0x%lx\n",
lpvAddr, GetLastError());
} else {
fprintf(stderr, "Lock Achieved at %lp\n", lpvAddr);
}


← →
MBo ©   (2003-02-17 13:32) [8]

пардон, скопировал, не посмотрев внимательно
p:=virtualalloc(nil,65536, MEM_COMMIT,PAGE_READWRITE);

MEM_RESERVE не передает память, только резервирует, и если так сделать, то нужен повторный вызов virtualalloc с commit



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.011 c
3-87290
mUTant
2003-02-05 23:35
2003.02.27
Как запустить программу на машине на которой не установлен Parado


14-87664
uw
2003-02-10 23:58
2003.02.27
Ищу живой 486-й


6-87598
Scoip
2003-01-10 15:48
2003.02.27
Доступ в иНет


3-87348
avch
2003-02-11 11:38
2003.02.27
Функция SQL


1-87434
Извращенец2
2003-02-18 15:58
2003.02.27
Блокировка окна программы




   Наверх