Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.11.2008, 15:47
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 1  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
По умолчанию Освобождение памяти Array и Dictionary

Допустим я напихал в Dicitionary 1 млн. интов или в Array, а потом хочу удалить 900000 из них (в Array удаляю с конца), как это сделать чтобы память занимаемая Array или Dicitionary освободилась (то есть чтобы их размер на сомом деле поменялся (а не просто изменилась только length в Array)).?

Старый 27.11.2008, 15:48
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Через некоторое время сработает GC.

Старый 27.11.2008, 15:54
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 3  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
2__etc
Он ведет себя так как будто эта память занята.
Вот код проверки этого:
Код:
package
{
	import flash.display.SpreadMethod;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.system.System;
	import flash.utils.Dictionary;
	import flash.utils.getTimer;
	
	public class Main extends flash.display.Sprite
	{
		private var d:Array;
		
		public function f(n:int):void
		{
			var s:Sprite;
			var a:Array = new Array();
			for (var i:int = 0; i < n; ++i)
			{
				s = new Sprite();
				a.push(s);
			}
			
		}
		private function efl(e:Event):void
		{
			trace(System.totalMemory);
			f(1000);
		}
		public function Main():void
		{
			var n:int = 10000000;
			var i:int;
		
			d = new Array();
			for (i = 0; i < n; ++i)
				d[i] = 0;

			trace(System.totalMemory);
			for (i = 0; i < n; ++i)
			{
				d.pop();
			}
			trace(System.totalMemory);
			stage.addEventListener(Event.ENTER_FRAME, efl);
		}
	}
}
Тем более судя по тормазнутости работы Array и по тому что ключи могут быть не только целые, Array скорее всего реалзиован в виде какого то сбалансировнного дерева, так что простым GC тут не обойтись - нужна перестройка дерева.


Последний раз редактировалось mikleb; 27.11.2008 в 15:58.
Старый 27.11.2008, 17:27
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 4  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Очень сомневаюсь насчёт дерева. Зачем там дерево, да ещё и сбалансированное? Сортировка там реализована, скорее всего, другим методом. Тем более, что есть возможность задать свою функцию сравнения при вызове sort(), а тогда необходимость в изначальном построении дерева отпадает, всё равно придётся перестраивать при вызове (т.к изменилась функция сравнения).

А насчёт GC – в API Flash Player 10 есть такая функция – System.gc(). Позволяет вызвать сборщик мусора вручную. Проверял – работает.

Старый 27.11.2008, 17:43
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 5  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
2SamFR
Скосроть работы Array такая же как и у Dictionary при целых ключах.
Поэтому это либо сбалансированное дерево либо какое то хэширование, других вариантов нету

Старый 27.11.2008, 18:13
SamFR вне форума Посмотреть профиль Отправить личное сообщение для SamFR Посетить домашнюю страницу SamFR Найти все сообщения от SamFR
  № 6  
Ответить с цитированием
SamFR

Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
Да, и правда. Конечно, это может быть вызвано какими-то особенностями работы FP с памятью. Но, похоже, и правда что-то вроде хеша. Вопрос только — зачем?

Старый 27.11.2008, 17:50
WGR вне форума Посмотреть профиль Отправить личное сообщение для WGR Посетить домашнюю страницу WGR Найти все сообщения от WGR
  № 7  
Ответить с цитированием
WGR
 
Аватар для WGR

Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
как вариант

Код AS3:
package {
           .......
 
	public class Main extends flash.display.Sprite {
		private var d:Array;
		private var d2:Array;
 
		private function efl(e:Event):void {
			trace(System.totalMemory);
			//f(100);
		}
		public function Main():void {
			var n:int=10000000;
			var i:int;
			trace(System.totalMemory);
			d = new Array();
			for (i = 0; i < n; ++i) {
				d[i]=0;
			}
 
			/*trace(System.totalMemory);
			for (i = 0; i < n; ++i) {
				d.pop();
			}*/
 
			d2=d.slice(-10000);
			d=new Array();
			trace(d2.length);
			trace(System.totalMemory);
			stage.addEventListener(Event.ENTER_FRAME, efl);
		}
	}
}
__________________
Lepricon Flash ICQ

Старый 27.11.2008, 17:55
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 8  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
2WGR
Это то понятно, но слишком медленно если размер массива изменяется постепенно. Похоже что так и придется делать, но пересоздавать массив только когда отношение новой длины к старой стало < 1/2.


Последний раз редактировалось mikleb; 27.11.2008 в 18:03.
Старый 27.11.2008, 18:28
mikleb вне форума Посмотреть профиль Отправить личное сообщение для mikleb Найти все сообщения от mikleb
  № 9  
Ответить с цитированием
mikleb

Регистрация: Feb 2008
Сообщений: 111
2SamFR
Скорее всего для того чтобы массив занимал O(количество элементов в нем) памяти, а не O(максимального индекса). Ведь есть такая возможность взять i > length массива и написать a[i] = чуму то. И памяти будет использовать не O(i), а O(количество элементов в массиве)

Старый 27.11.2008, 18:32
WGR вне форума Посмотреть профиль Отправить личное сообщение для WGR Посетить домашнюю страницу WGR Найти все сообщения от WGR
  № 10  
Ответить с цитированием
WGR
 
Аватар для WGR

Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
Цитата:
если размер массива изменяется постепенно
в зависимости от ваших решаемых задач можно попробовать разделить массив на те элементы что часто обновляются и те которые через продолжительное время.
Всё в ваших руках. Всегда можно найти более оптимальный вариант решения задачи..
__________________
Lepricon Flash ICQ

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 01:36.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.