使用pip安装Matplotlib时出现内存错误。

103

我正在使用Python 2.7,如果我尝试使用"pip install matplotlib"安装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"

问题可能是什么? 我正在使用带有16GB SD卡的树莓派2。 我仍然有8GB的空余数据,但仍然遇到此错误。 请帮忙。

3个回答

324

这个错误是因为看起来pip的缓存机制试图在缓存之前将整个文件读入内存,这在有限内存环境中会导致问题,因为matplotlib大小约为50mb。

一个更简单的解决方案是,在pip修补使用常量空间缓存算法之前,使用--no-cache-dir运行pip以避免缓存:

$ pip --no-cache-dir install matplotlib

10
在树莓派上遇到了这个问题。已解决! - fdelia
8
我也在树莓派2A上遇到了这个问题,使用这种方法解决了! - 8one6
3
解决了我的vagrant box的问题,尽管我不明白为什么我的vagrant box运行内存如此有限。 - johnklawlor
2
在树莓派 3B+ 上遇到了相同的问题,使用上述指示解决了。 - soumasandesu
2
谢谢,这也在有限内存的云实例中非常有用。 - Ilhicas
显示剩余3条评论

37

看起来你的RAM不足以从头开始构建matplotlib。为了解决这个问题,要么启用swap:

# 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

或者,如果您在SD卡上安装了Raspbian,您可以从存储库中安装matplotlib:

apt-get install python-matplotlib

嗨,我尝试了交换但仍然得到相同的错误。 - nishanth anand
如果我输入“sudo apt-get install matplotlib”,它会显示“E: 无法定位软件包matplotlib”。该怎么办?我是Linux新手,请帮忙。 - nishanth anand
我不记得包的确切名称(并且我的RPi在家里),但您可以通过发出“sudo apt-cache search matplotlib”来找到它。这应该会给您确切的名称。 - Andrey Sobolev
你尝试过在apt-cache中搜索matplotlib吗?似乎该软件包的正确名称是python-matplotlib - Andrey Sobolev
嗨,使用Pi 2和标准8Gb SD,swapfile方法对我有效。SD卡的大小不应该影响该过程,因为只有很少的空间用于交换。只是一个细节,我在Andrey的答案中使用了sudo来创建和操作所有的交换命令。我正在使用虚拟环境,参考了这个指南:(http://www.pyimagesearch.com/2015/02/23/install-opencv-and-python-on-your-raspberry-pi-2-and-b/),这个指南非常有帮助。 - Hugh Barnard
我在安装matplotlib时也遇到了MemoryError,但是这次是在BeagleBone Black上而不是树莓派上。原始的指令没有帮助,直到我将块计数从count=524288更改为count=1524288。之后一切都顺利了 :) - Erik Knowles

7

--no-cache-dir 对我没起作用。我只关闭了所有应用程序,然后才能完成安装。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接