Python导致:IOError:[Errno 28]设备上没有剩余空间:'../results/32766.html'在磁盘上有很多空间

时间:2011-08-09 14:46:24

标签: python filesystems hard-drive

我正在运行导致上述错误的Python脚本。不寻常的是这个脚本在不同的机器上运行,没有任何问题。

区别在于导致我写入外部硬盘驱动器问题的机器上。为了使事情变得更奇怪,这个脚本已在问题机器上运行,并已编写超过30,000个文件。

一些相关信息(导致错误的代码):

nPage = 0
while nPage != -1:
    for d in data:
        if len(d.contents) > 1:
            if '<script' in str(d.contents):
                l = str(d.contents[1])
                start = l.find('http://')
                end = l.find('>',start)
                out = get_records.openURL(l[start:end])
                print COUNT

                with open('../results/'+str(COUNT)+'.html','w') as f:
                    f.write(out)
                COUNT += 1

    nPage = nextPage(mOut,False)

我写的目录:

10:32@lorax:~/econ/estc/bin$ ll ../
total 56
drwxr-xr-x 3 boincuser boincuser  4096 2011-07-31 14:29 ./
drwxr-xr-x 3 boincuser boincuser  4096 2011-07-31 14:20 ../
drwxr-xr-x 2 boincuser boincuser  4096 2011-08-09 10:38 bin/
lrwxrwxrwx 1 boincuser boincuser    47 2011-07-31 14:21 results -> /media/cavalry/server_backup/econ/estc/results//
-rw-r--r-- 1 boincuser boincuser 44759 2011-08-09 10:32 test.html

证明有足够的空间:

10:38@lorax:~/econ/estc/bin$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             9.0G  5.3G  3.3G  63% /
none                  495M  348K  495M   1% /dev
none                  500M  164K  500M   1% /dev/shm
none                  500M  340K  500M   1% /var/run
none                  500M     0  500M   0% /var/lock
none                  9.0G  5.3G  3.3G  63% /var/lib/ureadahead/debugfs
/dev/sdc10            466G  223G  244G  48% /media/cavalry

我尝试过的一些事情:

  • 将写入路径更改为直接位置而不是通过链接
  • 重新启动计算机
  • 卸载并重新安装驱动器

7 个答案:

答案 0 :(得分:38)

任何情况下会触发ENOSPC(“设备上没有剩余空间”)错误,其中数据或元数据与I关联/ O操作由于空间不足而无法在任何地方写下来。这并不总是意味着磁盘空间 - 它可能意味着物理磁盘空间,逻辑空间(例如最大文件长度),特定数据结构或地址空间中的空间。例如,如果目录表(vfat)中没有空格或者没有任何inode,则可以获取它。它大致意味着“我找不到写下来的地方”。

特别是在Python中,这可能发生在任何写入I / O操作上。它可能发生在f.write期间,但也可能发生在openf.flush甚至f.close上。它发生的地方提供了一个至关重要的线索 - 如果它发生在open上,没有足够的空间来写入条目的元数据,如果它发生在f.write期间,{{1或者f.flush没有足够的磁盘空间或者你已经超过了最大文件大小。

如果给定目录中的文件系统是f.close,那么您在大约同一时间达到了最大文件限制。限制应该是2 ^ 16个目录条目,但如果我没记错的话,其他一些因素会影响它(例如,某些文件需要多个条目)。

最好避免在目录中创建这么多文件。很少有文件系统能够轻松处理这么多目录条目。除非您确定文件系统处理目录中的许多文件,否则您可以考虑另一种策略(例如创建更多目录)。

P.S。也不要相信剩余的磁盘空间 - 某些文件系统会为root保留一些空间,而其他文件系统会错误地计算可用空间并为您提供一个不正确的数字。

答案 1 :(得分:10)

尝试删除临时文件

cd /tmp/
rm -r *

答案 2 :(得分:8)

事实证明,对我来说最好的解决方案就是重新格式化驱动器。一旦重新格式化,所有这些问题都不再是问题。

答案 3 :(得分:4)

运行“ export TEMPDIR = / someDir”,其中某些目录是/ tmp以外的有效目录。 在运行python命令之前,在提示符下运行此命令。在我的情况下,这是“ pip install rasa [spacy]”,它早先失败了。

export命令允许您将指定的目录临时用作临时目录。

答案 4 :(得分:3)

就我而言,当我运行 df -i 时,它会显示我的inode数量已满,然后我必须删除一些小文件或文件夹。否则,一旦inode满了,它就不允许我们创建文件或文件夹。

您所要做的就是删除没有占用空间但负责填充inode的文件或文件夹。

答案 5 :(得分:2)

  1. 显示在何处分配内存sudo du -x -h / | sort -h | tail -40
  2. 如果它们占用大量内存,请从您的/tmp/home/user_name/.cache文件夹中删除。您可以通过运行sudo rm -R /path/to/folder

第2步概述了要从(/tmp/home/user_name/.cache)中删除的文件夹。如果您在运行第一个命令时又得到其他结果,表明您在其他地方使用了很多内存,那么建议您从这些位置删除时请多加注意。

答案 6 :(得分:0)

我遇到了类似的问题。上述删除 /tmp 目录的解决方案对我有用。

我没有使用服务帐户可能没有完全访问权限的默认 /tmp 位置(如果遵循最佳实践并且不使用 sudo 安装 Python 包),而是将 /tmp 目录移动到用户的主目录,使用 TMPDIR 环境pip install --user ... 命令支持的设置。

我遇到了上述空间不足的问题,如上述答案中所述,很可能是由于创建了太多文件/目录而实际上没有耗尽卷存储。对我有用的解决方案是删除 /home//$USER/tmp 目录并在每次我的持续部署管道运行时重新创建它。 rm -rf /tmp