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

2024-09-29 06:33:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

不同的是,在导致我写入外部硬盘时出现问题的计算机上。更奇怪的是,这个脚本在问题机器上运行,已经写了30000多个文件。

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

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

我试过的一些事情:

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

Tags: dev脚本机器nonebincountcontentsstart
3条回答

尝试删除临时文件

cd /tmp/
rm -r *

当与I/O操作相关联的数据或元数据由于缺少空间而无法写入任何位置时,ENOSPC(“设备上没有剩余空间”)错误将在任何情况下触发。这并不总是意味着磁盘空间——它可能意味着物理磁盘空间、逻辑空间(例如最大文件长度)、特定数据结构中的空间或地址空间。例如,如果目录表(vfat)中没有空间,或者没有任何索引节点,则可以获取它。大致意思是“我找不到写这件事的地方”。

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

如果给定目录中的文件系统是vfat,那么您将在达到最大文件限制的同时达到最大文件限制。限制应该是2^16个目录条目,但如果我正确地回忆起来,其他一些因素可能会影响它(例如,某些文件需要多个条目)。

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

另外,p.S.也不信任剩余的磁盘空间——一些文件系统为根用户保留了一些空间,而另一些文件系统错误地计算了可用空间,并给了你一个不正确的数字。

对我来说最好的解决办法就是重新格式化硬盘。一旦重新格式化,所有这些问题就不再是问题了。

相关问题 更多 >