2011-01-16 3 views
6

Я прочитал несколько тем о проблемах с памятью в R, и я не могу найти решение моей проблемы.R stats - проблемы с памятью при распределении большой матрицы/Linux

Я запускаю своего рода регрессию LASSO на нескольких подмножествах большого набора данных. Для некоторых подмножеств он работает хорошо, а для некоторых более крупных подмножеств он не работает, причем ошибки типа «не могут выделять вектор размером 1,6 ГБ». Ошибка возникает в этой строке кода:

example <- cv.glmnet(x=bigmatrix, y=price, nfolds=3) 

Это также зависит от числа переменных, которые были включены в «bigmatrix».

Я попытался использовать R и R64 для Mac и R для ПК, но недавно перешел на более быструю виртуальную машину в Linux, думая, что я избегу любых проблем с памятью. Это было лучше, но все же имело некоторые ограничения, хотя memory.limit указывает «Inf».

В любом случае, чтобы выполнить эту работу или мне нужно вырезать несколько переменных в матрице или взять меньший поднабор данных?

Я читал, что R ищет некоторые смежные биты памяти, и возможно, я должен предварительно выделить матрицу? Есть идеи ?

+1

С плоским 64-разрядным адресным пространством, находя временное адресное пространство будет без проблем. –

ответ

8

Позвольте мне немного объяснить, что сказал @richardh. Все данные, которые вы загружаете с помощью R, разгружают ОЗУ. Таким образом, вы загружаете свои основные данные, и в нем используется некоторое количество оперативной памяти. Затем вы подмножите данные, чтобы подмножество использовало меньший кусок. Тогда для регрессионного алгоритма нужен кусок, который больше вашего подмножества, потому что он выполняет некоторые манипуляции и колебания. Иногда я могу лучше использовать RAM, выполнив следующие действия:

  1. сохранить начальный набор данных на диск с помощью Сохранить()
  2. взять подмножество данных
  3. ют() исходный набор данных, так что больше не в памяти
  4. сделать анализ на подмножестве
  5. сохранить результаты анализа
  6. полностью сбросить все элементы в памяти: RM (список = Ls())
  7. нагрузки начальная d ataset с шагом-обратно в оперативную память с помощью нагрузки()
  8. петли шагов 2-7 при необходимости

Будь осторожен с шагом 6 и старайтесь не снимать свой глаз. Это сбрасывает ВСЕ в памяти R. Если он не будет сохранен, он исчезнет. Более тонким подходом было бы удаление больших объектов, которые вы уверены, что вам не нужны, а не rm (list = ls()).

Если вам по-прежнему требуется больше оперативной памяти, вы можете запустить анализ в облаке Amazon. Их четырехъядерный экстренный большой экземпляр имеет более 68 ГБ оперативной памяти. Иногда, когда я сталкиваюсь с ограничениями памяти, я нахожу, что проще всего просто пойти в облако, где я могу быть неаккуратным с ОЗУ, каким я хочу быть.

У Джереми Англила есть хороший blog post, который содержит несколько советов по управлению памятью в Р. В этом сообщении блога Джереми ссылки на this previous StackOverflow question, которые я нашел полезными.

+0

@JD - Лучше сказать! Я (медленно) изучаю пути. И хорошая находка на предыдущий вопрос. –

+0

Ваш ответ был хороший. Я просто бросил еще что-то сверху, так как я был подозрительным, что ОП не мог понять, к чему вы клоните. –

2

Я не думаю, что это связано с непрерывной памятью, но только то, что R по умолчанию работает только в ОЗУ (т. Е. Не может записывать в кеш). Farnsworth's guide to econometrics in R упоминает пакет filehash, чтобы включить запись на диск, но у меня нет опыта с ним.

Лучше всего работать с меньшими подмножествами, управлять памятью вручную, удаляя переменные, которые вам не нужны, с rm (т. Е. Запускать регрессию, сохранять результаты, удалять старую матрицу, загружать новую матрицу, повторять) и/или получить больше ОЗУ. НТН.

+1

Отсутствие ОЗУ обычно не приведет к ошибкам памяти. Система будет использовать пейджинг, чтобы справиться с нехваткой физической ОЗУ. Возможно, вы заметите, как вы обрушились, но почему вы видите отказ в распределении? –

+0

@ davide у вас есть опыт работы с R или вы говорите из опыта работы с другим программным обеспечением? R, несомненно, потерпит неудачу, если закончится ОЗУ. –

+0

@JD Как насчет пейджинга? R явно отключает пейджинг на диск ?! –

0

Пробег: bigmemory package. Он очень прост в использовании. Идея состоит в том, что данные хранятся в файле на жестком диске, и вы создаете объект в R в качестве ссылки на этот файл. Я проверил этот, и он работает очень хорошо.

Есть также альтернатива, например, «ff». См. CRAN Task View: High-Performance and Parallel Computing with R для получения дополнительной информации.

+1

Я только что попробовал пакет bigmemory и пакет ff. Пакет ff выглядит лучше. Это хрусталик! ;-) –

+0

как насчет загрузки данных с SQL-сервера? – user702846

Смежные вопросы