Chcę udzielić bardziej kompleksowej odpowiedzi na podstawie większości potencjalnych rozwiązań, które już zostały dostarczone. Chciałbym również wskazać jeszcze jedną potencjalną pomoc, która może pomóc w procesie czytania.
Opcja 1: dtypy
„dtypes” to dość potężny parametr, którego można użyć do zmniejszenia presji pamięci na read
metody. Zobacz tę i tę odpowiedź. Pandy domyślnie próbują wnioskować o typach danych.
Odnosząc się do struktur danych, każde zapisane dane, następuje przydział pamięci. Na poziomie podstawowym zapoznaj się z poniższymi wartościami (tabela poniżej ilustruje wartości dla języka programowania C):
The maximum value of UNSIGNED CHAR = 255
The minimum value of SHORT INT = -32768
The maximum value of SHORT INT = 32767
The minimum value of INT = -2147483648
The maximum value of INT = 2147483647
The minimum value of CHAR = -128
The maximum value of CHAR = 127
The minimum value of LONG = -9223372036854775808
The maximum value of LONG = 9223372036854775807
Sprawdź tę stronę, aby zobaczyć dopasowanie między NumPy i typami C.
Powiedzmy, że masz tablicę liczb z cyfr . Możesz zarówno teoretycznie, jak i praktycznie przypisać, powiedzmy tablicę 16-bitowych liczb całkowitych, ale wtedy przydzielisz więcej pamięci, niż faktycznie potrzebujesz do przechowywania tej tablicy. Aby temu zapobiec, możesz ustawić dtype
opcję na read_csv
. Nie chcesz przechowywać elementów tablicy jako długich liczb całkowitych, gdzie faktycznie możesz zmieścić je za pomocą 8-bitowych liczb całkowitych ( np.int8
lub np.uint8
).
Obserwuj poniższą mapę typu.
Źródło: https://pbpython.com/pandas_dtypes.html
Możesz przekazać dtype
parametr jako parametr w metodach pand tak read
jak w przypadku {kolumna: typ}.
import numpy as np
import pandas as pd
df_dtype = {
"column_1": int,
"column_2": str,
"column_3": np.int16,
"column_4": np.uint8,
...
"column_n": np.float32
}
df = pd.read_csv('path/to/file', dtype=df_dtype)
Opcja 2: odczytane przez kawałki
Odczytywanie danych we fragmentach umożliwia dostęp do części danych w pamięci, a także można zastosować wstępne przetwarzanie danych i zachować przetworzone dane zamiast danych surowych. Byłoby znacznie lepiej, gdyby połączyć tę opcję z pierwszą, dtypami .
Chciałbym wskazać sekcje książki kucharskiej pandy dotyczące tego procesu, gdzie można je znaleźć tutaj . Zwróć uwagę na te dwie sekcje;
Opcja 3: Dask
Dask to środowisko, które jest zdefiniowane na stronie internetowej Dask jako:
Dask zapewnia zaawansowaną równoległość analiz, umożliwiając skalowanie wydajności dla narzędzi, które kochasz
Urodził się, aby pokryć niezbędne części, do których nie mogą dotrzeć pandy. Dask to potężny framework, który pozwala na znacznie większy dostęp do danych poprzez przetwarzanie ich w sposób rozproszony.
Możesz użyć dask, aby wstępnie przetworzyć swoje dane jako całość, Dask zajmuje się fragmentacją, więc w przeciwieństwie do pand, możesz po prostu zdefiniować etapy przetwarzania i pozwolić Dask wykonać pracę. Dask nie dotyczy obliczeń zanim zostanie ona wyraźnie przesunąć compute
i / lub persist
(patrz odpowiedź tutaj różnicy).
Inne pomoce (pomysły)
- Przepływ ETL zaprojektowany dla danych. Zachowaj tylko to, co jest potrzebne z nieprzetworzonych danych.
- Najpierw zastosuj ETL do całych danych za pomocą frameworków takich jak Dask lub PySpark i wyeksportuj przetworzone dane.
- Następnie sprawdź, czy przetwarzane dane można zmieścić w pamięci jako całości.
- Rozważ zwiększenie pamięci RAM.
- Rozważ pracę z tymi danymi na platformie chmurowej.