![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
сбросить файловый буффер
ford © (2009-05-15 14:58:00)Доброго времени суток!
использую TFileStream для работы с файлом
файл достаточно большой, и много операций чтения и записи.
все время вылетала ошибка Out of Memory
попробовал проследить чегож ей не хватает
смотрел при помощи
var status:TMemoryStatus;
...
Status.dwLength := sizeof(TMemoryStatus);
GlobalMemoryStatus(Status);
...
оказалось что
заканчивается виртуальная память
status.dwAvailVirtual
физической еще много
проверил FastMM утечек нет
вобщем решил что это заканчивается буффер выделяемый виндой для работы с файлом
и при проверки остатка виртуальной памяти делю его закрытие и снова открываю
f.Free;
f:=TFileStram.Create(fName);
на сколько я помню, вроде бы была возможность сброса буфферов, выделяемых для файла, на диск.
но честно непомню как :(
в классе TFileStream и его родителях
ни какой функции не нашел
подскажите, как можно сбросить в данном случае все эти буфферы и освободить виртуальную память ???
или что лучше использовать вместо TFileStream
Сергей М. (2009-05-15 15:49:00) [1]
> к чему бы он
К тому что у THandleStream есть св-во Handle, которое и следует использовать параметром вызова FlushFileBuffers
Но против [6] я не возражаю)
ford (2009-05-15 15:45:00) [2]
> Игорь Шевченко © (15.05.09 15:41) [6]
>
> тебе нужен программист
очень содержательный ответ :)
тока вот к чему бы он
Игорь Шевченко (2009-05-15 15:41:00) [3]тебе нужен программист
ford (2009-05-15 15:37:00) [4]
> Сергей М. © (15.05.09 15:32) [4]
а Handle
который есть у объекта TFileStream
он пойдет для этой функции??
Сергей М. (2009-05-15 15:32:00) [5]
> ненайду её у себя в хелпе
Не в том хелпе ищешь.
Это WinAPI-функция, ищи ее в Win32 Programmer's Reference, а декларирована она соотв-но в Windows.pas
ford (2009-05-15 15:15:00) [6]
> Сергей М. © (15.05.09 15:05) [1]
>
> FlushFileBuffers
а где эта функция ??
в каком модуле
ненайду её у себя в хелпе
(поиском искал тока одна и то FlushFileBuff называется и судя по хелпу нето)
ford (2009-05-15 15:13:00) [7]
> Сергей М. © (15.05.09 15:05) [1]
после того как я вставил кусок
где проверяю
остаток виртуальной памяти
и ежели её менее 50000000 байт то
f.Free;
f:=TFileStream.Create(fName);
т.е. пересоздаю объект
память вертается в зад
:)
т.е. собственно говоря
я был прав
и это файловые буфферы
поэтому грабли именно тут
чесслово
(хотя я могу и ошибаться)
Сергей М. (2009-05-15 15:05:00) [8]FlushFileBuffers, но на "проблему" Out of Memory отсутствие явного сброса никак не влияет - ищи грабли в другом месте