Speicherfehler bei der Verwendung von pip install Matplotlib

89

Ich verwende Python 2.7. Wenn ich versuche, Matplotlib zu installieren, wird dieser Fehler angezeigt, wenn ich "pip install matplotlib" verwende.

 Exception:
  Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/pip/basecommand.py", line 232, in main
      status = self.run(options, args)
    File "/usr/local/lib/python2.7/dist-packages/pip/commands/install.py", line 339, in run
      requirement_set.prepare_files(finder)
    File "/usr/local/lib/python2.7/dist-packages/pip/req/req_set.py", line 355, in prepare_files
      do_download, session=self.session,
    File "/usr/local/lib/python2.7/dist-packages/pip/download.py", line 782, in unpack_url
      session,
    File "/usr/local/lib/python2.7/dist-packages/pip/download.py", line 667, in unpack_http_url
      from_path, content_type = _download_http_url(link, session, temp_dir)
    File "/usr/local/lib/python2.7/dist-packages/pip/download.py", line 843, in _download_http_url
      _download_url(resp, link, content_file)
    File "/usr/local/lib/python2.7/dist-packages/pip/download.py", line 615, in _download_url
      for chunk in progress_indicator(resp_read(4096), 4096):
    File "/usr/local/lib/python2.7/dist-packages/pip/utils/ui.py", line 46, in iter
      for x in it:
    File "/usr/local/lib/python2.7/dist-packages/pip/download.py", line 580, in resp_read
      decode_content=False):
    File "/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/response.py", line 256, in stream
      data = self.read(amt=amt, decode_content=decode_content)
    File "/usr/local/lib/python2.7/dist-packages/pip/_vendor/requests/packages/urllib3/response.py", line 186, in read
      data = self._fp.read(amt)
    File "/usr/local/lib/python2.7/dist-packages/pip/_vendor/cachecontrol/filewrapper.py", line 54, in read
      self.__callback(self.__buf.getvalue())
    File "/usr/local/lib/python2.7/dist-packages/pip/_vendor/cachecontrol/controller.py", line 205, in cache_response
      self.serializer.dumps(request, response, body=body),
    File "/usr/local/lib/python2.7/dist-packages/pip/_vendor/cachecontrol/serialize.py", line 81, in dumps
      ).encode("utf8"),
  MemoryError"

Was könnte das Problem sein? Ich verwende Himbeer Pi 2 mit einer 16 GB SD-Karte. Ich habe immer noch 8 GB Daten frei, erhalte aber immer noch diesen Fehler. Freundlich helfen

Nishanth Anand
quelle

Antworten:

291

Dieser Fehler tritt auf, weil der Caching-Mechanismus von pip anscheinend versucht, die gesamte Datei vor dem Caching in den Speicher einzulesen. Dies stellt ein Problem in einer Umgebung mit begrenztem Speicher dar, da matplotlib ~ 50 MB groß ist.

Eine einfachere Lösung, bis pip gepatcht wird, um einen Caching-Algorithmus pipmit konstantem Speicherplatz zu verwenden, besteht darin, mit --no-cache-dirzu arbeiten, um den Cache zu vermeiden:

$ pip --no-cache-dir install matplotlib
David Wolever
quelle
9
Hatte dieses Problem auf dem Raspberry Pi. Gelöst!
Fdelia
7
Hatte auch dieses Problem auf Raspberry Pi 2A und dies löste es!
8one6
2
Ich habe mein Problem in meiner Vagabundbox gelöst, obwohl ich nicht verstehe, warum meine Vagabundbox mit so begrenztem Speicher läuft
Johnklawlor
1
Das gleiche Problem wurde auf einem Raspberry Pi 3B + festgestellt und mithilfe der obigen Anweisungen behoben.
Charles Poon
1
Bei der Installation von matplotlib auf einem BeagleBone Black ist dieses Problem aufgetreten. Diese Lösung hat es behoben. Danke dir!
David Stein
31

Es scheint, dass Sie nicht genügend RAM haben, um matplotlib von Grund auf neu zu erstellen. Um dies zu überwinden, schalten Sie entweder Swap ein:

# create swap file of 512 MB
dd if=/dev/zero of=/swapfile bs=1024 count=524288
# modify permissions
chown root:root /swapfile
chmod 0600 /swapfile
# setup swap area
mkswap /swapfile
# turn swap on
swapon /swapfile

Wenn Sie Raspbian auf Ihrer SD-Karte installiert haben, können Sie matplotlib aus dem Repository installieren:

apt-get install python-matplotlib
Andrey Sobolev
quelle
Hallo, ich habe versucht zu tauschen, aber ich erhalte immer noch den gleichen Fehler.
Nishanth Anand
Wenn ich "sudo apt-get install matplotlib" gebe, heißt es "E: Paket matplotlib kann nicht gefunden werden". Was ist zu tun? Ich bin neu in Linux, also bitte helfen
Nishanth Anand
Ich erinnere mich nicht an den genauen Namen des Pakets (und habe mein RPi zu Hause), aber Sie können es durch Ausgabe herausfinden sudo apt-cache search matplotlib. Dies sollte Ihnen den genauen Namen geben.
Andrey Sobolev
Haben Sie versucht, apt-cache nach matplotlib zu durchsuchen? Es scheint, dass der richtige Name für das Paket ist python-matpolotlib.
Andrey Sobolev
Hallo, die Swapfile-Methode hat bei mir mit einem Pi 2 und einer Standard-8-Gbit-SD funktioniert. Die SD-Größe sollte keinen Einfluss auf das Verfahren haben, da nur wenig für den Austausch verwendet wird. Nur ein Detail, ich habe sudoalle Befehle zum Erstellen und Bearbeiten von Swaps in Andreys Antwort bearbeitet. Ich verwende eine virtuelle Umgebung als Leitfaden: ( pyimagesearch.com/2015/02/23/… ), die sich als sehr hilfreich erwiesen hat.
Hugh Barnard
6

--no-cache-dirhat bei mir nicht funktioniert. Ich habe gerade alle Apps geschlossen und erst dann konnte ich die Installation abschließen.

MrKsn
quelle