2013-02-15 5 views
0

Я вычисляю корреляцию между двумя наборами данных, но из-за большого размера данных (10 ГБ), в то время как моя оперативная память составляет всего 6 ГБ. Я столкнулся с проблемой памяти. Интересно, как можно разбить мой код?Как обрабатывать массив массивов в R?

dir1 <- list.files("D:sdr", "*.bin", full.names = TRUE) 
dir2 <- list.files("D:dsa", "*.img", full.names = TRUE) 
file_tot<-array(dim=c(1440,720,664,2)) 
for(i in 1:length(dir1)){ 
    file_tot[,,i,1] <- readBin(dir1[i], numeric(), size = 4 ,n = 1440 * 720 , signed = T) 
    file_tot[,,i,2] <- readBin(dir2[i], integer(), size = 2 ,n = 1440 * 720 , signed = F) 
    file_tot[,,i,2] <- file_tot[,,i,2]*0.000030518594759971 
    file_tot[,,i,2][file_tot[,,i,2] == 9999 ] <- NA 
} 
result<-apply(file_tot,c(1,2),function(x){cor(x[,1],x[,2])}) 

Но получил эту ошибку:

Error: cannot allocate vector of size 10.3 Gb 
In addition: Warning messages: 
1: In file_tot[, , i, 1] <- readBin(dir1[i], numeric(), size = 4, n = 1440 * : 
Reached total allocation of 16367Mb: see help(memory.size) 
2: In file_tot[, , i, 1] <- readBin(dir1[i], numeric(), size = 4, n = 1440 * : 
Reached total allocation of 16367Mb: see help(memory.size) 
3: In file_tot[, , i, 1] <- readBin(dir1[i], numeric(), size = 4, n = 1440 * : 
Reached total allocation of 16367Mb: see help(memory.size) 
4: In file_tot[, , i, 1] <- readBin(dir1[i], numeric(), size = 4, n = 1440 * : 
Reached total allocation of 16367Mb: see help(memory.size) 

ответ

1

Если вы только вычислите эту корреляцию, вам действительно не нужно переключаться на пакеты, такие как ff или bigmemory. Вы можете просто обрабатывать файлы в кусках. Когда вы планируете делать больше анализов, использование одного из больших пакетов данных может оказаться полезным.

Вот пример того, как можно обработать файлы chunkwise:

# Generate some data; in this case I only use 7 columns, 
# but it should scale to any number of columns (except 
# perhaps generating the files) 
dim <- c(1440, 7, 664, 2) 
# The last line should be replaced by the next for the data in 
# the question 
# dim <- c(1440, 770, 664, 2) 
for (i in seq_len(dim[3])) { 
    dat <- rnorm(dim[1]*dim[2]) 
    writeBin(dat, paste0("file", i, ".bin"), size = 4) 
    dat <- rnorm(dim[1]*dim[2]) 
    writeBin(dat, paste0("file", i, ".img"), size = 4) 
} 

dir1 <- list.files("./", "*.bin", full.names = TRUE) 
dir2 <- list.files("./", "*.img", full.names = TRUE) 

result <- array(dim=c(dim[1], dim[2])) 
file_tot<-array(dim=c(dim[1], dim[3], dim[4])) 

# Proces the files column by column 
for (j in seq_len(dim[2])) { 
    for(i in 1:length(dir1)){ 
    # Open first file 
    con <- file(dir1[i], 'rb') 
    # Skip to the next column 
    seek(con, (j-1)*dim[1]*4) 
    # Read colum 
    file_tot[,i,1] <- readBin(con, numeric(), size = 4 ,n = dim[1]) 
    close(con) 

    # And repeat for the next file 
    con <- file(dir2[i], 'rb') 
    seek(con, (j-1)*dim[1]*4) 
    file_tot[,i,2] <- readBin(con, numeric(), size = 4 ,n = dim[1]) 
    # For the datasets in the example the previous line should be replaced 
    # by the next three: 
    #file_tot[,i,2] <- readBin(con, integer(), size = 2 ,n = dim[1] , signed = F) 
    #file_tot[,i,2] <- file_tot[,i,2]*0.000030518594759971 
    #file_tot[,i,2][file_tot[,i,2] == 9999 ] <- NA 
    close(con) 
    } 
    result[,j] <-apply(file_tot,c(1),function(x){cor(x[,1],x[,2])}) 
} 
+0

, если я изменю от 7 до 10, я должен изменить что-нибудь еще? – sacvf

+0

Вы имеете в виду от 7 до 720? Да, это должно быть так, и ваши файлы img состоят из 2 байтовых целых чисел, и вы делаете что-то с отсутствующими значениями. Я оставил это. –

+0

no Я имел в виду количество столбцов, чтобы увеличить их, чтобы получить время, и это 1440 не 1140 – sacvf

1

очень распространенная проблема при работе с большими данными. К счастью, существует несколько решений:

  1. Используйте пакет bigData, такой как rhadoop.
  2. Использовать пакеты fileread для прокрутки, такие как ff и filehash.
  3. Используйте большую игру и связанные с ней пакеты, посмотрите ниже ссылки.

Ссылки могут оказаться полезными:

difference between ff and filehash package in R

In R which packages for loading larger data quickly

Example of bigmemory and friends with file backing

Work in R with very large data set

Далее I'd suggest you did this, but I did it for you.

Надеюсь, что немного исследований должно решить эту проблему! Удачи!