Форум: "Основная";
Текущий архив: 2003.02.27;
Скачать: [xml.tar.bz2];
ВнизЗапись чисел по указанному адресу Найти похожие ветки
← →
$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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c