繁体   English   中英

OSError: [Errno 28] 设备 Docker 上没有剩余空间,但我有空间

[英]OSError: [Errno 28] No space left on device Docker, but I have space

正如标题所示,我正在 docker 容器中运行 jupyter,并且我在以下行的 scikit learn/numpy 库中从 python 深处获取 OSError:

pickler.file_handle.write(chunk.tostring('C'))

我已经进行了一些故障排除,人们似乎遇到的大多数问题是他们的硬盘驱动器或 RAM 实际空间不足,而我 AFAIK 并非如此。

这是我的 df 的样子:

Filesystem                    1K-blocks       Used   Available Use% Mounted on
udev                           16419976          0    16419976   0% /dev
tmpfs                           3288208      26320     3261888   1% /run
/dev/sdb7                     125996884   72177548    47395992  61% /
tmpfs                          16441036     238972    16202064   2% /dev/shm
tmpfs                              5120          4        5116   1% /run/lock
tmpfs                          16441036          0    16441036   0% /sys/fs/cgroup
/dev/sdb2                         98304      32651       65653  34% /boot/efi
tmpfs                           3288208         68     3288140   1% /run/user/1000
//192.168.1.173/ppo-server3 16864389368 5382399064 11481990304  32% /mnt/ppo-server3

这是我的免费的样子:

             total        used        free      shared  buff/cache   available
Mem:       32882072     7808928    14265280      219224    10807864    24357276
Swap:        976892      684392      292500

我在看正确的 df 和 free 输出吗? 它们都从容器内的 bash 实例运行。

Docker 会留下悬空的图像,这些图像会占用您的空间。 要在 docker 之后进行清理,请运行以下命令:

docker system prune -af

或在旧版本的 docker 中:

docker rm $(docker ps -q -f 'status=exited')
docker rmi $(docker images -q -f "dangling=true")

这将删除退出和悬空的图像,这有望清除设备空间。

元:把这个答案放在这里是因为它是该失败的最高堆栈溢出结果,这是一个可能的修复方法。

正如@PeerEZ 的评论中所提到的,当 sklearn 尝试并行化作业时,就会发生这种情况。

sklearn 尝试通过写入 /dev/shm 来在进程之间进行通信,这在 docker 容器上限制为 64mb。

您可以尝试按照@PeerEZ 的建议使用 n_jobs=1 运行(如果您无法重新启动容器),或者如果需要并行化,请尝试使用--shm-size选项运行容器以设置更大的 /dev 大小/shm 。 例如。 ——

docker run --shm-size=512m <image-name>

如果它对任何人有帮助,我就会收到同样的错误,问题是我的一个应用程序日志文件 ( laravel.log ) 的大小几乎为laravel.log 删除该文件解决了我的问题。

在 Docker 中运行并行进程时,我遇到了同样的问题。 麻烦的是,默认情况下,某些进程使用 /dev/shm 来存储一些缓存数据,而 linux 中该位置的大小默认约为 64MB。 您可以使用 python 中的这两条代码行更改并行作业存储缓存的路径。 如果正在阅读本文的人正在使用 Pandaralel,则此解决方案可以为您提供帮助。

import os

os.environ['JOBLIB_TEMP_FOLDER'] = '/tmp'

对于 pandaralel 的用户,也添加此行

pandarallel.initialize(use_memory_fs = False )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM