Размер оформлен в 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)
Это сделает только две копии данных, хотя вы все еще можете использовать память.