Я экспериментирую с 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 распределении памяти, чтобы помочь мне справиться с такими проблемами?