Размер оформлен в R

Я зацикливаюсь на CSV-файлы и помещаю данные в "основной" фрейм данных

Я нахожусь на окнах и использую 32-битную R.

for(i in 1:length(files))
{
  print(files[i])
  f <- read.csv(files[i],header=TRUE, stringsAsFactors=FALSE)
  if(i ==1)
  {
    main= f
  }else
  {
    main = rbind(main, f)
  }
  print(dim(main))
  print(memory.size(max = FALSE))
}

Я получаю эту ошибку:

Error: cannot allocate vector of size 64.0 Mb

Последний отпечаток из основной и размер

[1] 4335123      49
[1] 2139.9

так что в основном 4,3 миллиона строк, и я думаю, что размер означает 2139 мегабайт в R.

Любая идея, как я могу обойти эту ошибку? Главное нужно провести около 7 миллионов строк.

Спасибо.

2 ответа

Это было бы большой загрузкой данных для сеанса R (и это может быть невозможно в 32-битной ОС). R нуждается в непрерывном пространстве памяти для любого нового объекта. Завершите работу R. выйдите из всех остальных программ и минимизируйте количество программ, которые будут загружаться при перезагрузке Windows. Затем только загрузите R и повторите попытку с новым сеансом.

Если это не поможет, вам нужно подумать об ограничении количества строк при загрузке файлов. Посмотрите на `? Read.csv" для параметра, который устанавливает верхний предел количества строк.

7 миллионов строк с 49 столбцами позволят создать объект шириной не менее 5*7000000*49 байтов, и это только в том случае, если каждый столбец состоит из односимвольных значений. Если бы они были числовыми столбцами, то требовалось бы вдвое больше места. Обычная конфигурация 32-битной Windows позволяет использовать только 2,5 ГБ, что теоретически может содержать данные минимального размера, но даже в этом случае вы, вероятно, не сможете ничего с этим сделать.

Вероятно, самым дешевым шагом будет аренда некоторого облачного пространства с экземпляром R и объемом памяти, достаточным для этой задачи, скажем, от 8 до 16 ГБ.

Вы применили подход "копировать и добавить" с main = rbind(main, f), что делает n * (n - 1) / 2 копии данных и очень неэффективно использует память. Вместо этого попробуйте "предварительное распределение и заполнение"

result = vector("list", length(files))
for (i in seq_along(files)) {
    ## ...
    result[[i]] = f
}

с последующим финалом rbind():

result = do.call("rbind", result)

Это сделает только две копии данных, хотя вы все еще можете использовать память.

Другие вопросы по тегам