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

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

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

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ę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.