Je souhaite apporter une réponse plus complète basée sur la plupart des solutions potentielles déjà proposées. Je tiens également à souligner une autre aide potentielle qui peut aider le processus de lecture.
Option 1: dtypes
"dtypes" est un paramètre assez puissant que vous pouvez utiliser pour réduire la pression mémoire des read
méthodes. Voyez ceci et cette réponse. Les pandas, par défaut, essaient de déduire les dtypes des données.
En se référant aux structures de données, à chaque donnée stockée, une allocation de mémoire a lieu. Au niveau de base, reportez-vous aux valeurs ci-dessous (le tableau ci-dessous illustre les valeurs pour le langage de programmation 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
Reportez-vous à cette page pour voir la correspondance entre les types NumPy et C.
Disons que vous avez un tableau d'entiers de chiffres . Vous pouvez à la fois théoriquement et pratiquement affecter, par exemple, un tableau de type entier 16 bits, mais vous alloueriez alors plus de mémoire que ce dont vous avez réellement besoin pour stocker ce tableau. Pour éviter cela, vous pouvez activer l' dtype
option read_csv
. Vous ne souhaitez pas stocker les éléments du tableau sous forme d'entier long où vous pouvez en fait les insérer avec un entier 8 bits ( np.int8
ou np.uint8
).
Observez la carte dtype suivante.
Source: https://pbpython.com/pandas_dtypes.html
Vous pouvez passer le dtype
paramètre comme paramètre sur les méthodes pandas comme dict sur read
comme {column: type}.
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)
Option 2: lire par morceaux
La lecture des données par blocs vous permet d'accéder à une partie des données en mémoire, et vous pouvez appliquer un prétraitement sur vos données et conserver les données traitées plutôt que les données brutes. Ce serait bien mieux si vous combinez cette option avec la première, dtypes .
Je tiens à souligner les sections du livre de recettes pandas pour ce processus, où vous pouvez le trouver ici . Notez ces deux sections ici;
Option 3: Dask
Dask est un framework défini sur le site Web de Dask comme:
Dask fournit un parallélisme avancé pour l'analyse, permettant des performances à grande échelle pour les outils que vous aimez
Il est né pour couvrir les parties nécessaires où les pandas ne peuvent pas atteindre. Dask est un framework puissant qui vous permet d'accéder beaucoup plus aux données en les traitant de manière distribuée.
Vous pouvez utiliser dask pour prétraiter vos données dans leur ensemble, Dask s'occupe de la partie de segmentation, donc contrairement aux pandas, vous pouvez simplement définir vos étapes de traitement et laisser Dask faire le travail. Dask n'applique pas les calculs avant d'être explicitement poussé par compute
et / ou persist
(voir la réponse ici pour la différence).
Autres aides (idées)
- Flux ETL conçu pour les données. Conserver uniquement ce qui est nécessaire à partir des données brutes.
- Tout d'abord, appliquez ETL à des données entières avec des frameworks comme Dask ou PySpark, et exportez les données traitées.
- Vérifiez ensuite si les données traitées peuvent être stockées dans la mémoire dans son ensemble.
- Pensez à augmenter votre RAM.
- Envisagez de travailler avec ces données sur une plateforme cloud.