Форум: "Основная";
Текущий архив: 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.064 c