Как node.js выделяет память для массивов? - PullRequest
0 голосов
/ 03 февраля 2020

Я экспериментирую с node.js массивами и столкнулся с каким-то странным поведением. Кажется, что максимальный размер массива в основном один и тот же, независимо от размера данных в массиве, за очень редкими исключениями. Вот мои тесты:

var array = []
var count = 0
data = 1
while(true){
  if(count % 1000000 == 0)
    console.log(count)
  array.push(data)
  count++
}

падает с кучей нехватки памяти на 75 миллионов записей, я думал, что это было особенно странно, потому что максимальный размер массива должен быть 2 ^ 32-1



var array = []
var count = 0
data = "l;aksdfa-0j34-09jpasdlkfj"
while(true){
  if(count % 1000000 == 0)
    console.log(count)
  array.push(data)
  count++
}

также аварийно завершает работу с кучей нехватки памяти на 75 миллионов записей



var array = []
var count = 0
data = "l;aksdfa-0j34-09jpasdlkfjo;dsiahjfop'isahdp'fjasldfijasdopifhjasp'dfosad'l;fasdl';flk'asjfldsjsdafsfadjksdafjkjfsaklljfakdjlfsdajlkasdjkafsljkfsdljksdajkfasljkdasljkasdjkfasljkasdjkafsjkfsdjkasdjksafjkfasjkfasjkfadjkafsjkasfj"
while(true){
  if(count % 1000000 == 0)
    console.log(count)
  array.push(data)
  count++
}

То же самое, что и предыдущий тест на 75 миллионов. Кажется, что независимо от размера строки, это не имеет значения



var array = []
var count = 0
data = "1"
while(true){
  if(count % 1000000 == 0)
    console.log(count)
  array.push(data + count)
  count++
}

Это также создает странное поведение. Я ожидал бы того же поведения, что и в предыдущем тесте, потому что эти строки меньше, чем предыдущие. Но вместо этого программа замедляет ОКОЛО 31 миллион записей и вылетает на 33 миллионах примерно через 5 минут



var array = []
var count = 0
data = "1lkj2nk3l2"
while(true){
  if(count % 1000000 == 0)
    console.log(count)
  data = data + count
  array.push(data)
  count++
}

Здесь мы имеем дело со строками, которые > миллиарды персонажей, поэтому я ожидаю, что он потерпит неудачу гораздо раньше. Программа начала замедляться с 17 миллионов и потерпела неудачу с 22 миллионами примерно через 15 минут

Итак, мой вопрос к переполнению стека: Почему все это происходит? И что мне нужно знать о node.js распределении памяти, чтобы помочь мне справиться с такими проблемами?

...