Converter o queryset em values_list () será mais eficiente em memória do que em values () diretamente. Visto que o método values () retorna um queryset de lista de dict (chave: pares de valor), values_list () retorna apenas uma lista de tupla (dados puros). Ele vai economizar cerca de 50% da memória, só precisa definir as informações da coluna quando você chamar pd.DataFrame ().
Método 1:
queryset = models.xxx.objects.values ("A", "B", "C", "D")
df = pd.DataFrame (list (queryset)) ## consome muita memória
#df = pd.DataFrame.from_records (queryset) ## funciona, mas não muda muito no uso de memória
Método 2:
queryset = models.xxx.objects.values_list ("A", "B", "C", "D")
df = pd.DataFrame (list (queryset), colunas = ["A", "B", "C", "D"]) ## isso economizará 50% da memória
#df = pd.DataFrame.from_records (queryset, colunas = ["A", "B", "C", "D"]) ## Não funciona. Crashed with data type is queryset not list
Eu testei isso em meu projeto com> 1 milhão de linhas de dados, o pico de memória foi reduzido de 2G para 1G.