сравнивая огромный вектор с фиксированным числом - PullRequest
1 голос
/ 10 мая 2011

Я хочу оценить, сколько компонентов v=rnorm(10^8) меньше или равно 0,5. Итак, я написал это

v=rnorm(10^8)
sum(v<=0.5)

К сожалению, я получаю это сообщение

> v=rnorm(10^8)
Error: cannot allocate vector of size 762.9 Mb
> sum(v<=0.5)
Error: object 'v' not found
R(3446,0xa046b540) malloc: *** mmap(size=800002048) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(3446,0xa046b540) malloc: *** mmap(size=800002048) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

Есть ли способ сделать это, учитывая, что я не могу уменьшить размер вектора v? Спасибо

Ответы [ 4 ]

4 голосов
/ 10 мая 2011

Поскольку вы работаете с последовательностью случайных чисел по очереди, вы можете разбить вектор на куски, например:

> set.seed(1)
> rnorm(10)
 [1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078 -0.8204684
 [7]  0.4874291  0.7383247  0.5757814 -0.3053884
> set.seed(1)
> rnorm(5)
[1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078
> rnorm(5)
[1] -0.8204684  0.4874291  0.7383247  0.5757814 -0.3053884

Итак:

ans <- 0
for (i in 1:10){
    x <- rnorm(10^7)
    ans <- ans + sum(x<=0.5)
    }

В конце каждого циклаитерация меньшего x должна быть удалена, так что вам потребуется только около 76 МБ памяти.

Для информации, я получил:

> ans
[1] 69142375

, который сравнивается с:

> pnorm(0.5)
[1] 0.6914625
3 голосов
/ 10 мая 2011

См., Среди многих других: этот вопрос , а изнутри R:? Память.

Проблема заключается в том, что нужный вам вектор не может быть выделен (в вашей системе), не говоря уже о том, чтобы вычислять что-то из него.

2 голосов
/ 10 мая 2011

Вы не предложили подробную информацию ни о вашей ОС, ни о версии R, ни о количестве и задачах других запущенных программ. Вы НЕ должны получать многострочные отчеты об ошибках malloc с инструкциями о том, где устанавливать точки останова с какой-либо из текущих версий R. Таким образом, у вас может быть устаревшая версия R, и вам следует подумать о получении текущей, если это так , Если у вас недостаточно памяти, вы должны получать однострочное сообщение, как если бы вам не удалось создать v. Необходима непрерывная память для хранения 10 ^ 8 элементов, и это будет занимать около 8 * 10 ^ 8 байт, а объем служебных данных может составлять 0,9 ГБ.

Попробуйте перезапустить свою ОС и не загружать другие программы. Начните новый сеанс R без загрузки какого-либо сохраненного рабочего пространства. Как правило, вам понадобится как минимум вдвое больше памяти для вашего большого объекта, поэтому я бы предложил (если в Windows) попробовать (memory.limit (size = 2000)). Затем повторите тест.

2 голосов
/ 10 мая 2011

Купите больше памяти и используйте 64-битную R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...