Błąd pamięci podczas korzystania z pip install Matplotlib

91

Używam Pythona 2.7, jeśli próbuję zainstalować Matplotlib, pojawia się ten błąd, jeśli używam „pip install matplotlib”

 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"

Jaki może być problem? Używam Raspberry Pi 2 z kartą SD 16 GB. Nadal mam wolne 8 GB danych, ale nadal pojawia się ten błąd. Uprzejma pomoc

nishanth anand
źródło

Odpowiedzi:

295

Ten błąd pojawia się, ponieważ wydaje się, że mechanizm buforowania pip próbuje wczytać cały plik do pamięci przed zapisaniem go w pamięci podręcznej… co stwarza problem w środowisku z ograniczoną pamięcią, ponieważ matplotlib ma wielkość ~ 50 MB.

Prostszym rozwiązaniem, dopóki pip nie zostanie poprawiony tak, aby używał algorytmu buforowania stałej przestrzeni, jest uruchomienie pipw --no-cache-dircelu uniknięcia pamięci podręcznej:

$ pip --no-cache-dir install matplotlib
David Wolever
źródło
9
Miałem ten problem na Raspberry Pi. Rozwiązany!
fdelia
7
Miałem też ten problem na Raspberry Pi 2A i to go rozwiązało!
8one6
2
Rozwiązałem mój problem w moim pudełku włóczęgi, chociaż nie rozumiem, dlaczego moje pudełko włóczęgi działa z tak ograniczoną pamięcią
johnklawlor
1
Napotkano ten sam problem na Raspberry Pi 3B + i rozwiązano zgodnie z powyższymi instrukcjami.
Charles Poon
1
Napotkano ten problem podczas instalowania matplotlib na BeagleBone Black. To rozwiązanie rozwiązało problem. Dziękuję Ci!
David Stein
31

Wygląda na to, że masz za mało pamięci RAM, aby zbudować matplotlib od podstaw. Aby temu zaradzić, włącz zamianę:

# 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

Lub, jeśli masz zainstalowany raspbian na karcie SD, możesz zainstalować matplotlib z repozytorium:

apt-get install python-matplotlib
Andrey Sobolev
źródło
Cześć, próbowałem zamienić, ale nadal pojawia się ten sam błąd.
nishanth anand
jeśli podam „sudo apt-get install matplotlib”, pojawi się komunikat „E: Nie można zlokalizować pakietu matplotlib”, co należy zrobić? Jestem nowy w Linuksie, więc
proszę o
Nie pamiętam dokładnej nazwy paczki (a RPi mam w domu), ale możesz się tego dowiedzieć, wydając sudo apt-cache search matplotlib. To powinno dać ci dokładną nazwę.
Andrey Sobolev
Czy próbowałeś przeszukać apt-cache pod kątem matplotlib? Wygląda na to, że właściwa nazwa pakietu to python-matpolotlib.
Andrey Sobolev
Cześć, metoda swapfile zadziałała dla mnie z Pi 2 i standardowym SD 8Gb. Rozmiar SD nie powinien mieć żadnego znaczenia dla procedury, ponieważ tylko niewielka część jest używana do wymiany. Tylko szczegół, sudozredagowałem wszystkie polecenia tworzenia zamiany i manipulacji w odpowiedzi Andreya. Używam wirtualnego środowiska jako tego przewodnika: ( pyimagesearch.com/2015/02/23/… ), które okazało się bardzo pomocne.
Hugh Barnard
6

--no-cache-dirnie działa dla mnie. Właśnie zamknąłem wszystkie aplikacje i dopiero wtedy mogłem dokończyć instalację.

MrKsn
źródło