Комбинирането на два масива от хешове, всеки от които има по 100 хиляди елемента, води до изчерпване на паметта на процес, изпълняван на 2GB VM. Не мога да разбера как/защо.
Да кажем, че имам хеш като този и го попълвам с 50 двойки ключ/стойност.
h = {}
1..50.times{ h[SecureRandom.hex] = SecureRandom.hex}
Поставям 100k h
s в два масива така:
a = []
a1 = []
1..100_000.times{ a << h }
1..100_000.times{ a1 << h }
Когато се опитам да добавя a1
в a
, IRB изчерпва паметта:
2.1.1 :008 > a << a1
NoMemoryError: failed to allocate memory
Наистина ли двата масива са твърде големи, за да се комбинират в паметта? Какъв е предпочитаният начин да се постигне това?
Изпълнявам ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-linux]
и виртуалната машина няма други процеси, работещи на нея.
a << a1
също добавя препратка къмa1
в края. Може би искатеa += a1
. - person tadman   schedule 13.08.2014a << a1
всъщност не копира нищо друго освен препратка към a1. Подозирам, че това, което наистина се случва, е, че IRB изчерпва паметта, докато се опитва да покаже получения масив. - person Ajedi32   schedule 13.08.2014a += a1; nil
завършва мигновено без скок в паметта. Искате ли да изпратите отговор за това? - person user1032752   schedule 14.08.2014