Использование памяти Применить против карты. Использование виртуальной памяти и блокировки

Мне нужно было найти сумму всех пар чисел в длинном списке пар. В Mathematica есть множество способов сделать это, но я думал об использовании либо Plus , либо Total . Поскольку Total работает со списками, Map является инструментом функционального программирования для использования там, а Apply на уровне 1 (@@@) - для Plus , поскольку Plus принимает числа, которые нужно добавить, в качестве аргументов.

Вот демонстрационный код ( предупреждение : сохраните всю свою работу перед выполнением этого!):

pairs = Tuples[Range[6000], {2}]; (* toy example *)

TimeConstrained[Plus @@@ pairs; // Timing, 30]

(* Out[4]= {21.73, Null} *)

Total /@ pairs; // Timing

(* Out[5]= {3.525, Null} *)

Вы могли заметить, что я добавил TimeConstrained в код для Плюс . Это защитная мера, которую я включил для вас, потому что голый код поставил мой компьютер почти на колени. Фактически, приведенный выше код работает для меня, но если я увеличу диапазон в первой строке до 7000, мой компьютер просто заблокируется и никогда не вернется. Ничего не работает, нет alt-period, переключение программ, ctrl-alt-delete, попытки запустить диспетчер процессов с помощью панели задач, закрытие крышки ноутбука, чтобы он спал и т. Д., На самом деле ничего.

Проблема вызвана чрезмерным использованием памяти строкой Plus @@@ pair . В то время как сама «пара» занимает около 288 МБ, а список составляет половину от этого объема, линейка Plus быстро потребляет около 7 ГБ для своих вычислений. Это конец моей свободной физической памяти, и все, что больше, вызывает использование виртуальной памяти на диске. И Mathematica и / или Windows, очевидно, плохо работают при использовании виртуальной памяти (кстати, MacOS и Linux ведут себя лучше?). Напротив,строка Total не оказывает заметного влияния на график использования памяти.

У меня два вопроса:

  1. Учитывая эквивалентность между Plus и Total , как указано в документация ( «Всего [список] эквивалентно Применить [Плюс, список].» ) как объяснить крайнюю разницу в поведении? Я предполагаю, что это связано с различиями между Apply и Map , но мне любопытны задействованные внутренние механизмы.
  2. Я знаю, что могу ограничить объем памяти, занимаемый команда с использованием MemoryConstrained , но мучительно использовать ее везде, где вы подозреваете, что Mathematica может захватить все ваши системные ресурсы. Есть ли глобальный параметр, который я могу использовать, чтобы указать Mathematica использовать только физическую память (или, желательно, определенную часть ее) для всех своих операций? Это было бы чрезвычайно полезно, поскольку такое поведение привело к нескольким зависаниям за последние пару недель, и это действительно начинает меня раздражать.
9
задан Sjoerd C. de Vries 31 July 2011 в 18:41
поделиться