Estou explorando a mudança para python e pandas como um usuário SAS de longa data.
No entanto, ao executar alguns testes hoje, fiquei surpreso que python ficou sem memória ao tentar pandas.read_csv()
um arquivo csv de 128 MB. Ele tinha cerca de 200.000 linhas e 200 colunas de dados principalmente numéricos.
Com o SAS, posso importar um arquivo csv para um conjunto de dados SAS e pode ser tão grande quanto meu disco rígido.
Existe algo análogo em pandas
?
Trabalho regularmente com arquivos grandes e não tenho acesso a uma rede de computação distribuída.
Respostas:
Em princípio, ele não deveria ficar sem memória, mas atualmente existem problemas de memória
read_csv
em arquivos grandes causados por alguns problemas internos complexos do Python (isso é vago, mas é conhecido há muito tempo: http://github.com/pydata / pandas / questões / 407 ).No momento não há uma solução perfeita (aqui está uma tediosa: você pode transcrever o arquivo linha por linha em um array NumPy pré-alocado ou arquivo mapeado em memória--
np.mmap
), mas é uma que estarei trabalhando em um futuro próximo. Outra solução é ler o arquivo em partes menores (usariterator=True, chunksize=1000
) e depois concatenar compd.concat
. O problema surge quando você puxa o arquivo de texto inteiro para a memória de uma só vez.fonte
Wes está certo, claro! Estou apenas entrando na conversa para fornecer um código de exemplo um pouco mais completo. Tive o mesmo problema com um arquivo de 129 Mb, que foi resolvido por:
fonte
df = concate(tp, ignore_index=True)
?AssertionError: first argument must be a list-like of pandas objects, you passed an object of type "TextFileReader"
. Alguma ideia do que está acontecendo aqui?pd.concat(list(tp), ignore_index=True)
Este é um segmento mais antigo, mas eu só queria despejar minha solução alternativa aqui. Eu tentei inicialmente o
chunksize
parâmetro (mesmo com valores bem pequenos como 10000), mas não ajudou muito; ainda tinha problemas técnicos com o tamanho da memória (meu CSV era de ~ 7,5 Gb).No momento, acabei de ler pedaços dos arquivos CSV em uma abordagem de loop for e adicioná-los, por exemplo, a um banco de dados SQLite passo a passo:
fonte
pandas.read_csv
retorna diretamente (pelo menos na versão que estou usando atualmente) um iterador se você simplesmente forneceriterator=True
echunksize=chunksize
. Portanto, você apenas faria umfor
loop sobre apd.read_csv
chamada, em vez de instanciar novamente todas as vezes. No entanto, isso custa apenas a sobrecarga da chamada, talvez não haja um impacto significativo.iterator=True
echunksize
já existiam naquela época, se bem me lembro. Talvez houvesse um bug em uma versão mais antiga que causou o estouro da memória - vou tentar novamente na próxima vez que ler um grande DataFrame no Pandas (estou usando o Blaze agora para essas tarefas)Abaixo está o meu fluxo de trabalho.
Com base no tamanho do arquivo, é melhor otimizar o tamanho dos pedaços.
Depois de ter todos os dados no banco de dados, você pode consultar aqueles que precisa do banco de dados.
fonte
Se você deseja carregar arquivos csv enormes, o dask pode ser uma boa opção. Ele imita a api dos pandas, por isso é bastante semelhante aos pandas
link para dask no github
fonte
Você pode usar o Pytable em vez do pandas df. Ele é projetado para grandes conjuntos de dados e o formato de arquivo é hdf5. Portanto, o tempo de processamento é relativamente rápido.
fonte