Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

Как получить доступ к 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 вся ветка

Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.034 c
1-1102343942
Dysan
2004-12-06 17:39
2004.12.19
дополнения к IDE Delphi


4-1099863792
Змей
2004-11-08 00:43
2004.12.19
Логин


3-1100811562
_Lucky_
2004-11-18 23:59
2004.12.19
Что означает сей SQL код


10-1072519836
Guest
2003-12-27 13:10
2004.12.19
TAO Developer s Guide


3-1100855013
Geoji
2004-11-19 12:03
2004.12.19
Выделить часть





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский