Python导致:IOError:[Errno 28] 设备上没有剩余空间:'../results/32766.html',而磁盘上有很多空间
我在运行一个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 个回答
试着删除临时文件
rm -r /tmp/
ENOSPC
错误的意思是“设备上没有剩余空间”。这个错误会在任何情况下出现,只要与输入输出操作相关的数据或元数据因为没有空间而无法写入。这并不总是指硬盘空间,可能是指物理硬盘空间、逻辑空间(比如文件的最大长度)、某个数据结构中的空间或者地址空间。例如,如果目录表(vfat)没有空间,或者没有剩余的inode(索引节点),你都会遇到这个错误。简单来说,就是“我找不到地方来写这个东西”。
特别是在Python中,任何写入操作都有可能出现这个错误。它可能在f.write
时发生,但也可能在open
、f.flush
甚至f.close
时发生。发生错误的地方可以给你提供重要的线索:如果是在open
时发生,说明写入元数据的空间不够;如果是在f.write
、f.flush
或f.close
时发生,说明硬盘空间不足或者你超过了文件的最大大小。
如果你在的目录使用的是vfat
文件系统,你可能会在达到最大文件限制的时候遇到这个错误。这个限制大约是2^16个目录条目,但我记得还有其他因素可能会影响这个限制(比如某些文件需要多个条目)。
最好不要在一个目录里创建太多文件。很少有文件系统能轻松处理这么多目录条目。除非你确定你的文件系统能很好地处理目录中的大量文件,否则可以考虑其他策略(比如创建更多的目录)。
另外,不要完全相信剩余的硬盘空间。有些文件系统会为根用户保留一些空间,还有一些文件系统会错误计算可用空间,给你一个不准确的数字。
结果我发现,最好的解决办法就是重新格式化这个硬盘。一旦重新格式化了,这些问题就都不再是问题了。