Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-87695
herosofnn
2003-02-11 15:30
2003.02.27
Изображения на кнопки


3-87280
AndDem
2003-02-07 13:19
2003.02.27
Как в RunTime получить UserName из ADOConnection?


1-87403
Btginer1
2003-02-15 13:58
2003.02.27
как создать свечение у Label


8-87576
VVVaaa
2002-11-12 11:32
2003.02.27
Проблемка с выводом на image


14-87652
Катерина
2003-02-06 22:14
2003.02.27
Silja Line





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский