我正在运行一个导致上述错误的
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
我尝试过的一些事情:
>将写入的路径更改为直接位置,而不是通过链接
>重新启动机器
>卸载并重新安装驱动器
解决方法
在任何情况下,ENOSPC(“设备上剩余空间”)错误都将被触发,因为缺少空间,任何地方无法将I / O操作的数据或元数据写入相关数据或元数据.这并不总是意味着磁盘空间 – 它可能意味着物理磁盘空间,逻辑空间(例如最大文件长度),特定数据结构或地址空间中的空间.例如,如果目录表(vfat)中没有空格,或没有剩余的任何索引节点,您可以获取它.它大概意味着“我找不到写下来的地方”.
特别是在Python中,这可能发生在任何写I / O操作中.它可能在f.write期间发生,但它也可能发生在open,f.flush甚至f.close上.发生的地方提供了一个至关重要的线索,因为它的确 – 如果发生在开放的时候,没有足够的空间来写入条目的元数据,如果它发生在f.write,f.flush或f.close那里没有足够的磁盘空间,或者您已超过最大文件大小.
如果给定目录中的文件系统是vfat,那么您将在与之相同的时间内达到最大文件限制.该限制应该是2 ^ 16个目录条目,但是如果我正确地回忆一些其他因素可能会影响它(例如一些文件需要多个条目).
最好避免在目录中创建这么多文件.很少的文件系统很容易处理这么多的目录条目.除非您确定文件系统与目录中的许多文件兼容,否则可以考虑另一策略(例如创建更多目录).
附:还不要相信剩余的磁盘空间 – 一些文件系统为root保留一些空间,而其他文件系统会计算可用空间,并给出一个不正确的数字.