Пытаюсь прочитать большой файл (порядка 700 Мб), для чего выделяю память вызовом функции:
VirtualAlloc(NULL, dwViewSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
где
dwViewSize = 0x1000000; // 16 Мб
затем в цикле читаю с помощью ReadFile. Все было бы хорошо, если бы не катастрофическое уменьшение свободной памяти после каждого ReadFile. Это безобразие творится, конечно же, под Windows 98. Вопрос: можно как-нибудь предотвратить сабж?
Код прилагается:
HANDLE hand = CreateFile(aFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
LPVOID pAddress = VirtualAlloc(NULL, dwViewSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
DWORD dwRead;
while(ReadFile(hand, pAddress, dwViewSize, &dwRead, NULL))
{
// здесь обрабатывю данные ...
}
VirtualFree(pAddress, NULL, MEM_RELEASE);
// ...
Здравствуйте, Thrush, Вы писали:
Не знаю, насколько поможет, но попробуй FILE_FLAG_NO_BUFFERING в CreateFile. Эта штука не дает кэшировать файл. Может, память за счет кэша уходит?
- Простите, профессор, не пса, а когда он уже был человеком.
— То-есть он говорил? Это еще не значит быть человеком. (с) Булгаков
Здравствуйте, Thrush, Вы писали:
T>Пытаюсь прочитать большой файл (порядка 700 Мб), для чего выделяю память вызовом функции:
<snip>
T>T>HANDLE hand = CreateFile(aFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
T>LPVOID pAddress = VirtualAlloc(NULL, dwViewSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
T>DWORD dwRead;
T>while(ReadFile(hand, pAddress, dwViewSize, &dwRead, NULL))
T>{
T> // здесь обрабатывю данные ...
T>}
T>VirtualFree(pAddress, NULL, MEM_RELEASE);
T>// ...
T>
Покажи, что ты делаешь внутри while. Вполне возможно, что утечка там.
Serge.
Hасколько проще была бы жизнь, если бы она была в исходниках.
Здравствуйте, small_cat, Вы писали:
_>Не знаю, насколько поможет, но попробуй FILE_FLAG_NO_BUFFERING в CreateFile. Эта штука не дает кэшировать файл. Может, память за счет кэша уходит?
Спасибо, FILE_FLAG_NO_BUFFERING помог. Что интересно, в Win2K и без этого флага все ОК.