Что лучший способ состоит в том, чтобы освободить память браузера при работе с большими массивами в JavaScript?

Это - то, как у меня есть вещи установка:

  • container.html
  • database1.js (содержит большой массив, названный database1),
  • database2.js (содержит большой массив, названный database2),

Вот образец массива (сокращен от 6 000 + строки к 2):

var database1=[[
    "2010-01-03 07:45","2010-01-03 11:00","534","A","","","","","Installed washing machine","0","1","1","Indeed","",""],[
    "2010-03-20 15:00","2010-03-20 16:00","571","F","","","","","Installed oven","0","5","1","Indeed","",""],[
    etc,etc,etc...]];

Когда я добавляю database1.js голове на контейнере, память, используемая для IE в окнах, спрыгивает с 7,7 МБ к 21,9 МБ. Это прекрасно, я могу теперь циклично выполниться, хотя массив назвал database1 (первая строка, и столбец в database1[0][0]).

Проблема состоит в том, что я должен повторно добавлять файл базы данных время от времени и при этом увеличения использования памяти (я думал, что массив базы данных будет перезаписан).

Таким образом, первые повторно добавляют использование памяти нажатий в IE до 30,4 МБ, но затем продолжает увеличиваться на каждом, повторно добавьте: 30,4 МБ> 33,9 МБ> 39,5 МБ> 42,1 МБ и т.д.

Для предотвращения этого, я теперь очищаю каждый объект в массиве, прежде чем я повторно добавлю database1 файл.

for ( var i=0, il=database1.length; i<il; i++ ){
delete database1[i];
}
//append database1.js to head code here

Это действительно помогает. Использование памяти не уменьшается до начальных 7,7 МБ, но действительно однако уменьшается с 21,9 МБ до 14,1 МБ. Следующие повторно добавляют, увеличивает память до 25,9 МБ (очищающийся с циклом: 18,8 МБ). Следующие повторно добавляют, увеличивает память до 29,3 МБ (очищающийся с циклом: 24,5 МБ).

Я рад, что использование памяти не поднимается как быстро, но возможно это может быть оптимизировано далее? К сожалению, перезагрузка страницы HTML не является опцией.

7
задан Ben 20 June 2010 в 14:46
поделиться

1 ответ

Управлять памятью в JavaScript помогает сборщик мусора - функция языка, которая периодически удаляет ненужную память.

Оператор delete по сути обозначает область памяти как более не нужную. Память будет деаллоцирована при следующем запуске сборщика мусора.

Сборка мусора не предсказуема - delete $var или $var = null позволит сборщику мусора деаллоцировать память со временем. Это может быть не мгновенно. Вот почему использование памяти растет не так быстро, как вы ожидаете, и вот почему delete $var не уменьшает использование памяти так быстро, как вы ожидаете.

В IE есть средство принудительного запуска сборщика мусора:

if (typeof(CollectGarbage) == "function") {
    CollectGarbage();
}

Ваш скрипт может замедлиться, пока это происходит, особенно если нужно деаллоцировать большой объем памяти.

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

Короче говоря:

  • ваше использование delete database1[i] - лучшее, что вы можете сделать
  • это приведет к деаллокации памятисо временем
  • использование памяти вернется к ожидаемому уровнюсо временем
  • вы можете принудительно собрать мусор в IE, но этот процесс в конечном итоге произойдет сам по себе
6
ответ дан 7 December 2019 в 09:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: