2016-10-12 2 views
1

У меня полная потеря на этом. У меня есть большая, хотя и не необоснованная, матрица для моего кадра данных в R (48000 * 19). Я пытаюсь использовать sm.ancova() для исследования дифференциальных эффектов наклонов, но получилстранный размер списка в R, объяснение?

error: cannot allocate vector of size 13.1GB 

13GB перегружена память, выделенную для R, я получаю это. Но что?! Весь файл CSV, который я читал, был всего 24 000 КБ. Почему эти одиночные векторы настолько велики в R?

код ANCOVA я использую:

data1<-read.csv("data.csv") 
attach(data1) 
sm.ancova(s,dt,dip,model="none") 

Глядя в него немного, я использовал:

diag(s) 
length(s) 
diag(dt) 
length(dt) 
diag(dip)  
length(dip) 

Что все дали ту же самую ошибку. Их длина составляет 48000.

Любое объяснение поможет. Исправить было бы лучше :)

Заранее спасибо!

Ссылка фиктивных данных, которая воспроизводит эту проблему, можно найти по адресу: https://www.dropbox.com/s/dxxofb3o620yaw3/stackexample.csv?dl=0

+1

Возможный обман: [Управление памятью R/не может выделять вектор размера n] (http://stackoverflow.com/q/5171593/903061) – Gregor

+2

'sm.ancova' пытается выделить объект большого размера. Код, написанный автором пакета, скорее всего, не настолько эффективен как память. – Vlo

+0

Грегор: не совсем, этот пытается найти работу для законно негабаритных данных. Я пытаюсь понять, почему мои векторы становятся настолько большими (на порядок больше, чем исходный файл) и как их предотвратить. Похоже, но немного другое – Jesse001

ответ

4

Получить данные:

## CSV file is 10M on disk, so it's worth using a faster method 
## than read.csv() to import ... 
data1 <- data.table::fread("stackexample.csv",data.table=FALSE) 
dd <- data1[,c("s","dt","dip")] 

Если вы даете diag() вектор, он будет пытаться сделать диагональную матрицу с этим вектор по диагонали. Пример набора данных, который вы нам предоставили, составляет 96 000 строк, поэтому diag(), примененный к любому элементу, попытается построить матрицу размером 96 000 х 96 000. Матрица 1000x1000 является

format(object.size(diag(1000)),"Mb") ## 7.6 Mb 

поэтому матрица вы пытаетесь построить здесь будет^2 96 * 7,6/1024 = 68 Gb.

24Kx24K матрица будет в 16 раз меньше, но все равно около 4 Gb ...

Это является можно использовать разреженных матриц построить большие диагональные матрицы:

library(Matrix) 
object.size(Diagonal(x=1:96000)) 
## 769168 bytes 

В более общем , не все аналитические программы записываются с вычислительной эффективностью (скоростью или памятью). Документы, на которых основан этот метод (?sm.ancova), были написаны в конце 1990-х годов, когда 24 000 наблюдений составили огромный набор данных ...

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