Maison >développement back-end >Tutoriel Python >Pourquoi ne puis-je pas créer de grands tableaux NumPy sur Ubuntu et comment puis-je corriger l'erreur d'allocation de mémoire ?

Pourquoi ne puis-je pas créer de grands tableaux NumPy sur Ubuntu et comment puis-je corriger l'erreur d'allocation de mémoire ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-27 11:44:09536parcourir

Why Can't I Create Large NumPy Arrays on Ubuntu, and How Can I Fix the Memory Allocation Error?

Problème d'allocation de mémoire lors de la création d'un tableau Numpy

Problème

Lors de la création d'un grand tableau NumPy avec le type de données 'uint8' sur Ubuntu 18, vous pouvez rencontrez l'erreur :

numpy.core._exceptions.MemoryError: Unable to allocate array with shape and data type uint8

Cela se produit même si le système dispose de suffisamment de mémoire disponible et ne rencontre pas le même problème sur MacOS.

Solution

La cause première de ce problème est le mode de gestion de surcharge du système d'exploitation. Par défaut, la surcommission est désactivée, ce qui signifie que le noyau refusera les allocations qui dépassent la mémoire disponible.

Pour résoudre ce problème :

  1. Vérifiez le mode de surcommission actuel en exécutant cat /proc/ sys/vm/overcommit_memory.
  2. Activez le surengagement agressif en exécutant echo 1 > /proc/sys/vm/overcommit_memory (en tant que root).

Comprendre le surcommit

Avec le surcommit agressif activé, le système autorise les allocations même si elles dépassent la mémoire physique. En effet, le noyau s'attend à ce que seule une fraction de la mémoire allouée soit activement utilisée.

Implications

Bien qu'un surengagement agressif puisse résoudre le problème d'allocation, il doit être utilisé avec prudence :

  • Évitez d'utiliser une surcharge agressive pour les tableaux non fragmentés, car cela peut entraîner une perte de mémoire. épuisement.
  • Si vous écrivez manuellement dans des emplacements de mémoire, assurez-vous que les erreurs de page sont explicitement déclenchées pour allouer de la mémoire physique.
  • Sachez que le système peut subir une dégradation des performances si la mémoire allouée est activement utilisé.

Exemple

Avec le surengagement agressif activé, le code suivant devrait travail :

import numpy as np
a = np.zeros((156816, 36, 53806), dtype='uint8')
print(a.nbytes)  # Output: 303755101056

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn