Вниз
Скачать: 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.01 c
14-87689
Goblinus
2003-02-11 15:35
2003.02.27
Лицензионный Delphi


3-87309
SL57
2003-02-07 11:23
2003.02.27
Как сделать выборку по отсутствующем значениям


1-87433
Main.php
2003-02-18 15:54
2003.02.27
Загрузка JPG с диска в DXImageList


1-87373
radion
2003-02-14 14:26
2003.02.27
Как написать чтоб Делпхи считал гласные и согласные буквы?


3-87267
BlackTiger
2003-02-07 23:49
2003.02.27
Странное поведение DevExpress cxGrid при экспорте в Excel.




   Наверх