Объединение двух массивов хэшей, каждый из которых содержит 100 тыс. элементов, приводит к тому, что процессу, работающему на виртуальной машине объемом 2 ГБ, не хватает памяти. Я не понимаю, как/почему.
Допустим, у меня есть такой хэш, и я заполняю его 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