MemoryError
Python
Erreur courante
Explication
L'erreur `MemoryError` survient quand le programme tente d'allouer **plus de mémoire (RAM) que disponible**. C'est typiquement le cas en chargeant un énorme fichier ou une immense liste entièrement en mémoire, ou lors d'une croissance non bornée.
```python
donnees = [0] * (10**10) # des milliards d'éléments
# MemoryError
```
Causes courantes
- **Chargement complet** d'un fichier ou d'un CSV gigantesque en mémoire. - **Liste / dictionnaire** qui grossit sans limite (boucle, accumulation). - **Grandes matrices** ou structures dupliquées. - **Fuite de mémoire** : des références conservées empêchent la libération.
1. Traitez en flux (streaming), ligne par ligne
with open("enorme.txt", encoding="utf-8") as f:
for ligne in f: # ne charge qu'une ligne à la fois
traiter(ligne)
2. Traitez par morceaux (pandas)
import pandas as pd
for bloc in pd.read_csv("enorme.csv", chunksize=100_000):
traiter(bloc)
3. Utilisez des générateurs au lieu de listes
carres = (x * x for x in range(10**8)) # paresseux, pas de liste géante
total = sum(carres)
4. Choisissez des types efficaces
Pour de gros tableaux numériques, numpy (ou array) consomme bien moins que des listes Python. Pensez aussi au Python 64 bits.
Comment prevenir cette erreur
- **Ne chargez jamais** un fichier volumineux entièrement : itérez ou découpez.
- **Préférez les générateurs** aux listes pour les grands volumes.
- **Surveillez la croissance** des structures dans les boucles longues.
- Référence : [docs.python.org — MemoryError](https://docs.python.org/fr/3/library/exceptions.html#MemoryError).
Besoin d'aide sur votre projet ?
Besoin d'aide sur un probleme technique ? Decrivez-le pour des recommandations.
Nous contacterQuestions frequentes
Comment lire un fichier de plusieurs Go sans `MemoryError` ?
Itérez dessus ligne par ligne (`for ligne in fichier:`) ou par blocs (`pandas` avec `chunksize`). Ne faites jamais `f.read()` sur un fichier géant.
Une liste en compréhension consomme-t-elle plus qu'un générateur ?
Oui : `[x for x in ...]` construit toute la liste en mémoire, alors que `(x for x in ...)` produit les éléments à la demande. Pour de gros volumes, le générateur évite le `MemoryError`.