Konwersja zestawu zapytań na values_list () będzie bardziej wydajna w pamięci niż bezpośrednio na wartości (). Ponieważ metoda values () zwraca zestaw zapytań zawierający listę dict (pary klucz: wartość), lista_wartości () zwraca tylko listę krotek (czyste dane). Zaoszczędzi to około 50% pamięci, wystarczy ustawić informacje o kolumnie podczas wywoływania pd.DataFrame ().
Metoda 1:
queryset = models.xxx.objects.values („A”, „B”, „C”, „D”)
df = pd.DataFrame (list (queryset)) ## zużywa dużo pamięci
#df = pd.DataFrame.from_records (queryset) ## działa, ale bez większych zmian w zużyciu pamięci
Metoda 2:
queryset = models.xxx.objects.values_list („A”, „B”, „C”, „D”)
df = pd.DataFrame (list (queryset), columns = ["A", "B", "C", "D"]) ## to zaoszczędzi 50% pamięci
#df = pd.DataFrame.from_records (queryset, columns = [„A”, „B”, „C”, „D”]) ## To nie działa. Awaria z typem danych to queryset, a nie lista.
Przetestowałem to w moim projekcie z danymi> 1 miliona wierszy, pamięć szczytowa została zmniejszona z 2G do 1G.