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

57 投票
10 回答
244818 浏览
提问于 2025-04-16 23:12

我在运行一个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

我尝试过的一些方法:

  • 将写入路径改为直接位置,而不是通过链接
  • 重启机器
  • 卸载并重新挂载硬盘

10 个回答

24

试着删除临时文件

rm -r /tmp/
71

ENOSPC错误的意思是“设备上没有剩余空间”。这个错误会在任何情况下出现,只要与输入输出操作相关的数据或元数据因为没有空间而无法写入。这并不总是指硬盘空间,可能是指物理硬盘空间、逻辑空间(比如文件的最大长度)、某个数据结构中的空间或者地址空间。例如,如果目录表(vfat)没有空间,或者没有剩余的inode(索引节点),你都会遇到这个错误。简单来说,就是“我找不到地方来写这个东西”。

特别是在Python中,任何写入操作都有可能出现这个错误。它可能在f.write时发生,但也可能在openf.flush甚至f.close时发生。发生错误的地方可以给你提供重要的线索:如果是在open时发生,说明写入元数据的空间不够;如果是在f.writef.flushf.close时发生,说明硬盘空间不足或者你超过了文件的最大大小。

如果你在的目录使用的是vfat文件系统,你可能会在达到最大文件限制的时候遇到这个错误。这个限制大约是2^16个目录条目,但我记得还有其他因素可能会影响这个限制(比如某些文件需要多个条目)。

最好不要在一个目录里创建太多文件。很少有文件系统能轻松处理这么多目录条目。除非你确定你的文件系统能很好地处理目录中的大量文件,否则可以考虑其他策略(比如创建更多的目录)。

另外,不要完全相信剩余的硬盘空间。有些文件系统会为根用户保留一些空间,还有一些文件系统会错误计算可用空间,给你一个不准确的数字。

10

结果我发现,最好的解决办法就是重新格式化这个硬盘。一旦重新格式化了,这些问题就都不再是问题了。

撰写回答