Estou com problemas ao tentar usar objetos grandes em R. Por exemplo:
> memory.limit(4000)
> a = matrix(NA, 1500000, 60)
> a = matrix(NA, 2500000, 60)
> a = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb
> a = matrix(NA, 2500000, 60)
Error: cannot allocate vector of size 572.2 Mb # Can't go smaller anymore
> rm(list=ls(all=TRUE))
> a = matrix(NA, 3500000, 60) # Now it works
> b = matrix(NA, 3500000, 60)
Error: cannot allocate vector of size 801.1 Mb # But that is all there is room for
Entendo que isso esteja relacionado à dificuldade de obter blocos contíguos de memória ( daqui ):
As mensagens de erro iniciadas não podem alocar vetor de tamanho indicam uma falha na obtenção de memória, porque o tamanho excedeu o limite de espaço de endereço para um processo ou, mais provavelmente, porque o sistema não conseguiu fornecer a memória. Observe que em uma compilação de 32 bits, pode haver bastante memória livre disponível, mas não um bloco contíguo de espaço de endereço grande o suficiente para mapear.
Como posso resolver isso? Minha principal dificuldade é que chego a um determinado ponto do meu script e R não pode alocar 200-300 Mb para um objeto ... Na verdade, não posso pré-alocar o bloco porque preciso da memória para outro processamento. Isso acontece mesmo quando eu removo objetos desnecessariamente desnecessariamente.
EDIT: Sim, desculpe: Windows XP SP3, 4Gb RAM, R 2.12.0:
> sessionInfo()
R version 2.12.0 (2010-10-15)
Platform: i386-pc-mingw32/i386 (32-bit)
locale:
[1] LC_COLLATE=English_Caribbean.1252 LC_CTYPE=English_Caribbean.1252
[3] LC_MONETARY=English_Caribbean.1252 LC_NUMERIC=C
[5] LC_TIME=English_Caribbean.1252
attached base packages:
[1] stats graphics grDevices utils datasets methods base
Calloc
e comFree
memória, mas suspeito que não é isso que Benjamin está fazendo.Respostas:
Considere se você realmente precisa de todos esses dados explicitamente ou a matriz pode ser esparsa? Existe um bom suporte no R (veja o
Matrix
pacote para, por exemplo) para matrizes esparsas.Mantenha todos os outros processos e objetos em R no mínimo quando precisar criar objetos desse tamanho. Use
gc()
para limpar a memória agora não utilizada ou, melhor ainda, crie o objeto necessário em uma sessão .Se o exposto acima não puder ajudar, obtenha uma máquina de 64 bits com tanta RAM quanto você puder pagar e instale a R. de 64 bits.
Se você não puder fazer isso, existem muitos serviços online para computação remota.
Se você não puder fazer isso, as ferramentas de mapeamento de memória, como o pacote
ff
(oubigmemory
como Sascha menciona), ajudarão a criar uma nova solução. Na minha experiência limitada,ff
está o pacote mais avançado, mas você deve ler oHigh Performance Computing
tópico em Exibições de tarefas do CRAN.fonte
Para usuários do Windows, o seguinte me ajudou bastante a entender algumas limitações de memória:
gc()
para fazer coleta de lixo => funciona, eu posso ver o uso da memória descer para 2 GBConselhos adicionais que funcionam na minha máquina:
fonte
gc()
é apenas uma ilusão. Verificar o Gerenciador de tarefas é apenas uma operação muito básica do Windows. O único conselho que posso concordar com está economizando em formato .rdatagc()
isso não funciona. Eu só quero dizer que R faz isso automaticamente, então você não precisa fazê-lo manualmente. Veja aquigc()
Funciona . Você só não precisa usá-lo porque R faz isso internamenteAqui está uma apresentação sobre esse tópico que você pode achar interessante:
http://www.bytemining.com/2010/08/taking-r-to-the-limit-part-ii-large-datasets-in-r/
Eu mesmo não tentei as coisas discutidas, mas o
bigmemory
pacote parece muito útilfonte
A maneira mais simples de contornar essa limitação é alternar para 64 bits R.
fonte
Error: cannot allocate vector of size ... Gb
(mas sim, tenho muitos dados).Encontrei um problema semelhante e usei 2 unidades flash como 'ReadyBoost'. As duas unidades proporcionaram um aumento adicional de 8 GB de memória (para cache) e solucionaram o problema e também aumentaram a velocidade do sistema como um todo. Para usar o Readyboost, clique com o botão direito do mouse na unidade, vá para propriedades e selecione 'ReadyBoost' e selecione o botão de opção 'usar este dispositivo' e clique em Aplicar ou em OK para configurar.
fonte
Eu segui a página de ajuda do memor.limit e descobri que no meu computador o R, por padrão, pode usar até 1,5 GB de RAM e que o usuário pode aumentar esse limite. Usando o código a seguir,
me ajudou a resolver meu problema.
fonte
Se você estiver executando seu script no ambiente linux, poderá usar este comando:
e o servidor alocará a memória solicitada para você (de acordo com os limites do servidor, mas com um bom servidor - arquivos enormes podem ser usados)
fonte
server_name
? Estou enfrentando issocannot allocate vector size...
tentando fazer uma enorme Matriz de Termo de Documento em uma AMI e não consigo descobrir por que ela não tem memória suficiente ou quanto mais preciso alugar. Obrigado!O método salvar / carregar mencionado acima funciona para mim. Não sei como
gc()
desfragmentar a memória, mas isso parece funcionar.fonte