Python导致:IOError:[Errno 28]设备上没有剩余空间:'/results/32766.html';在具有大量空间的磁盘上

Python导致:IOError:[Errno 28]设备上没有剩余空间:'/results/32766.html';在具有大量空间的磁盘上,python,filesystems,hard-drive,Python,Filesystems,Hard Drive,我正在运行导致上述错误的Python脚本。不寻常的是,这个脚本运行在不同的机器上,没有任何问题 区别在于,在导致问题的机器上,我正在向外部硬盘驱动器写入数据。为了让事情变得更奇怪,这个脚本已经在有问题的机器上运行,并且已经编写了30000多个文件 一些相关信息(导致错误的代码): 证明有足够的空间: 10:38@lorax:~/econ/estc/bin$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1

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

区别在于,在导致问题的机器上,我正在向外部硬盘驱动器写入数据。为了让事情变得更奇怪,这个脚本已经在有问题的机器上运行,并且已经编写了30000多个文件

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

证明有足够的空间:

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
我尝试过的一些事情:

  • 将写入路径更改为直接位置,而不是通过链接
  • 重新启动机器
  • 卸下并重新安装驱动器
在与I/O操作相关的数据或元数据因空间不足而无法写入任何位置的任何情况下,都会触发ENOSPC(“设备上没有剩余空间”)错误。这并不总是意味着磁盘空间——它可能意味着物理磁盘空间、逻辑空间(例如,最大文件长度)、特定数据结构中的空间或地址空间。例如,如果目录表(vfat)中没有空间或没有任何inode,您可以获得它。它的大致意思是“我找不到把这写下来的地方”

特别是在Python中,这可能发生在任何写I/O操作上。它可以在
f.write
期间发生,但也可以在
open
上、在
f.flush
上甚至在
f.close
上发生。它发生的位置为它发生的原因提供了重要线索–如果它发生在
open
上,没有足够的空间为条目写入元数据,如果它发生在
f.write
f.flush
f.close
期间,则没有足够的磁盘空间,或者您已经超过了最大文件大小

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

最好避免在一个目录中创建这么多文件。很少有文件系统能够轻松地处理如此多的目录条目。除非你确信文件系统能很好地处理目录中的许多文件,否则你可以考虑另一种策略(例如创建更多的目录)。
另外,不要相信剩余的磁盘空间——有些文件系统为root用户保留了一些空间,而另一些文件系统错误地计算了可用空间,并给出了一个不正确的数字

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

尝试删除临时文件

cd /tmp/
rm -r *

在我的例子中,当我运行df-I时,它会显示我的索引节点已满,然后我必须删除一些小文件或文件夹。否则,一旦inode变满,它将不允许我们创建文件或文件夹

您只需删除尚未占用全部空间但负责填充索引节点的文件或文件夹。

运行“export TEMPDIR=/someDir”,其中someDir是除/tmp以外的有效目录。 在运行python命令之前,在提示符下运行此命令。在我的例子中,是“pip安装rasa[spacy]”,这是早些时候失败的

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

  • 显示分配内存的位置
    sudo du-x-h/| sort-h | tail-40
  • 如果
    /tmp
    /home/user\u name/.cache
    文件夹占用大量内存,请从这些文件夹中删除。您可以通过运行
    sudorm-R/path/to/folder

  • 步骤2概述了要删除的常见文件夹(
    /tmp
    /home/user\u name/.cache
    )。如果在运行第一个命令时返回其他结果,显示您在其他位置使用了大量内存,我建议在从这些位置删除时要更加小心。

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

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


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

    什么样的文件系统是
    /media/cavalry
    ?也许您可以发布
    /proc/mounts
    中的相关行。您只是用完了inode吗?如果您包含完整的回溯(错误发生在哪一行?),文件系统类型和空闲inode计数(
    df-i
    ),这将非常有用。在这种情况下,我怀疑文件系统是
    vfat
    ,并且您已经超过了目录中的最大文件数。@Rosh-+1-请注意文件名是32766-该数字会引发警报:)顺便说一句,对于32768个目录条目,您应该将注释移到answers32766+“+”。嗯…@Rosh是的,没有更多的索引节点了。有趣。Rosh如果你把你的评论贴到一个答案上,我可以把它列为选择。但我也在想我能做些什么来纠正这个问题,从哪里可以获得更多关于vfat系统中inode的信息。谢谢首先,这是在“开放”线上发生的。第二,我想用我的最后一句话来发表这篇文章:文件系统Inodes IUsed IFree IUse%Mounted on/dev/sdc10
    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
    
    cd /tmp/
    rm -r *