MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Reduza a memória usada carregando enorme dataframe de pandas do MongoDB


O que está em um CSV e o que está em um dataframe são duas coisas muito diferentes. Por exemplo, 9.9 e 9.99999999999999 em um CSV ocupará a mesma quantidade de espaço em um dataframe.

Dito isso, os dados em um dataframe ocupam muito menos espaço do que os dados em uma lista. Construir uma lista é caro na memória; e anexar a um dataframe requer que os pandas criem um novo dataframe (maior), copie tudo e deixe o dataframe original para ser coletado como lixo.

Você provavelmente faria muito melhor se pré-alocou um dataframe de 60.000 linhas (ou quantas linhas você tiver no total); por exemplo.:
data = pd.DataFrame(np.empty((60000,), dtype=[
    ('x', np.uint8),
    ('y', np.float64)
]))

e, em seguida, para cada linha, insira dados para essa linha, sem depender de dataset Lista:
data.values[count,:] = rowdata_at_count

Isso não é seguro para tipos, mas é bem rápido (já que nenhuma alocação está ocorrendo), portanto, certifique-se de que rowdata_at_count é uma lista cujos elementos correspondem aos tipos de coluna.

EDITAR

Sim, anexar 100 linhas é, acredito, como 100 concats de uma linha (já que cada acréscimo deve realocar e copiar a tabela, assim como concat). A pré-alocação evita anexar e concatenar:o tamanho da tabela não muda, nenhuma realocação e cópia precisam ser feitas.