Вниз
Скачать: CL | DM;

Как получить доступ к FMemory TMemoryStream?   Найти похожие ветки 

 
Aleksandr.   (2004-12-03 12:57) [0]

Для уменьшения фрагментации памяти я сделал финт ушами - каждый дергающий MemoryStreamы поток сразу резервирует участок памяти, и все Streamы разворачивает в ней. Для этого просто сделал потомка от TMemoryStream, который не выделяет для своего FMemory новые блоки, а юзает переданный в констракторе указатель. Но оказалась проблема - потомка пришлось рисовать в Classes, так как, несмотря на виртуальность метода ReAlloc, свойство Memory только на чтение. Соответственно, после этого изменения некоторые dcu стали требовать перекомпиляции. Пришлось энтого потомка выносить из Classes, но тогда становится недоступным FMemory. Как с ним можно работать, чтобы не менять Classes?


 
TUser ©   (2004-12-03 13:14) [1]

А это действительно уменьшит фрагментацию? Кстати, что такое фрагментация в данном случае?


 
Aleksandr.   (2004-12-03 13:27) [2]

TUser © :

Фрагментацию это действительно уменьшает - мелкие всякие объекты не разрезают освобождаемые блоки на части собой, работая за пределами резервированных диапазонов - проверил на тестовой проге.
Суть фрагментации в том, что в каждом цикле поток загружает MemoryStream и дописывает или вставляет в нем что-то, то есть каждый раз под стрим берется немного больший блок памяти, чем в прошлый раз. Соответственно, в предыдущий взятый и освобожденный участок в следующем цикле он уже не влезает и выбирает у операционки новый участок, я смотрел по FreeBig. Так и получается, что через некоторое время у проги огромное количество маленьких свободных участков и ноль доступной памяти в системе.


 
TUser ©   (2004-12-03 13:39) [3]

Боюсь сморозить чепуху - не, кажется, о таких вещах должен заботиться windows. В крайнем случае - Борландовский менеждер памяти. В случае TmemoryStream использованы стандартные средства оп. системы - вот пусть система и заботится о том, как уменьшить фрагментацию.

Кстати - может не закрывать потоки, а испольовать один и тот же MemoryStream - просить под него памяти все больше и больше. Тогда и проблемы не возникнет.


 
Aleksandr.   (2004-12-03 13:51) [4]

TUser © :

Увы, винда о таких вещах не заботится абсолютно. И менеджер Борланда, хотя и лучше мелкософтного, но тоже этим не занимается. Проблема не зависит от закрытия/незакрытия потока. Она зависит от функций GetMem, AllocMem-ReAllocMem.


 
Digitman ©   (2004-12-03 14:04) [5]


> Aleksandr.   (03.12.04 13:51) [4]


а не проще ли реализовать собственный менеджер ?


 
Aleksandr.   (2004-12-03 14:09) [6]

Digitman © :

Слабо мне такое. Это вопрос долгого времени и многих ошибок, а работа у меня - не вольный поиск решений.


 
Verg ©   (2004-12-03 14:18) [7]

Ну так на пять минут работы: Скопируй из Classes исходники классов TStream, TCustomMemoryStream, TMemoryStream в свой модуль, переименуй их всех и измени в соответствии со своими нуждами.


 
Aleksandr.   (2004-12-03 14:27) [8]

Verg ©  :
Да, знаете, так и пришлось поступить. Правда, TStream не нужен, достуточно объявить TCustomPointeredMemoryStream его потомком.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.022 c
14-1101958957
080D:07BBh
2004-12-02 06:42
2004.12.19
Кажется опять студенты пошли со своими лабараторными.


3-1100784403
Bless
2004-11-18 16:26
2004.12.19
события в MSSQL


1-1101266849
Dema-X
2004-11-24 06:27
2004.12.19
как вставить в редактор WORD содержимое буфера


1-1101978886
denis24
2004-12-02 12:14
2004.12.19
передача картинки из одного image в другой image


14-1101821971
AlexG
2004-11-30 16:39
2004.12.19
Великий демократический (крестовый) поход!




   Наверх