![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
Допустим я напихал в Dicitionary 1 млн. интов или в Array, а потом хочу удалить 900000 из них (в Array удаляю с конца), как это сделать чтобы память занимаемая Array или Dicitionary освободилась (то есть чтобы их размер на сомом деле поменялся (а не просто изменилась только length в Array)).?
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Через некоторое время сработает GC.
|
|
|||||
|
Регистрация: 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);
}
}
}
Последний раз редактировалось mikleb; 27.11.2008 в 15:58. |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Очень сомневаюсь насчёт дерева. Зачем там дерево, да ещё и сбалансированное? Сортировка там реализована, скорее всего, другим методом. Тем более, что есть возможность задать свою функцию сравнения при вызове sort(), а тогда необходимость в изначальном построении дерева отпадает, всё равно придётся перестраивать при вызове (т.к изменилась функция сравнения).
А насчёт GC – в API Flash Player 10 есть такая функция – System.gc(). Позволяет вызвать сборщик мусора вручную. Проверял – работает. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
2SamFR
Скосроть работы Array такая же как и у Dictionary при целых ключах. Поэтому это либо сбалансированное дерево либо какое то хэширование, других вариантов нету |
|
|||||
|
Регистрация: Mar 2008
Адрес: Ростов-на-Дону
Сообщений: 354
|
Да, и правда. Конечно, это может быть вызвано какими-то особенностями работы FP с памятью. Но, похоже, и правда что-то вроде хеша. Вопрос только — зачем?
|
|
|||||
|
Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
|
как вариант
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 |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
2WGR
Это то понятно, но слишком медленно если размер массива изменяется постепенно. Похоже что так и придется делать, но пересоздавать массив только когда отношение новой длины к старой стало < 1/2. Последний раз редактировалось mikleb; 27.11.2008 в 18:03. |
|
|||||
|
Регистрация: Feb 2008
Сообщений: 111
|
2SamFR
Скорее всего для того чтобы массив занимал O(количество элементов в нем) памяти, а не O(максимального индекса). Ведь есть такая возможность взять i > length массива и написать a[i] = чуму то. И памяти будет использовать не O(i), а O(количество элементов в массиве) |
|
|||||
|
Регистрация: Apr 2007
Адрес: Мишень на карте России
Сообщений: 95
|
Цитата:
Всё в ваших руках. Всегда можно найти более оптимальный вариант решения задачи..
__________________
Lepricon Flash ICQ |
![]() |
![]() |
Часовой пояс GMT +4, время: 01:36. |
|
|
« Предыдущая тема | Следующая тема » |
|
|