Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.02.27;
Скачать: 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 вся ветка

Текущий архив: 2003.02.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.021 c
3-87261
Ich Hasse
2003-02-07 23:25
2003.02.27
Сортировка SQL запросом


3-87308
Serg123
2003-02-10 13:10
2003.02.27
Rave 5


3-87273
smus
2003-02-07 10:51
2003.02.27
Запрос на логин и пароль в Interbase


4-87750
avch
2003-01-13 06:40
2003.02.27
Убийство


14-87677
Style
2003-02-07 19:07
2003.02.27
Мастера зацените компонент Грид + Дерево