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

jos*_*osh 29 python filesystems hard-drive

我正在运行导致上述错误的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)
Run Code Online (Sandbox Code Playgroud)

我正在写的目录:

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
Run Code Online (Sandbox Code Playgroud)

证明有足够的空间:

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
Run Code Online (Sandbox Code Playgroud)

我试过的一些事情:

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

Ros*_*ron 44

ENOSPC错误("左设备上没有空间")将在触发任何在该数据或情况的元数据与I/O操作相关联,不能在任何地方,因为缺乏空间写下来.这并不总是意味着磁盘空间 - 它可能意味着物理磁盘空间,逻辑空间(例如最大文件长度),特定数据结构或地址空间中的空间.例如,如果目录表(vfat)中没有空格或者没有任何inode,则可以获取它.它大致意味着"我找不到写下来的地方".

特别是在Python中,这可能发生在任何写入I/O操作上.它可能发生在f.write,但它也可能发生在open,f.flush甚至发生f.close.它发生的地方提供了一个至关重要的线索 - 如果它发生在open那里没有足够的空间来写入条目的元数据,如果它发生在期间f.write,f.flush或者f.close没有足够的磁盘空间或你已经超出了最大文件大小.

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

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

PS也不信任剩余的磁盘空间 - 一些文件系统为root保留了一些空间,而其他文件系统错误地计算了可用空间并给你一个不正确的数字.

  • 我使用Python 3,Jupyter Notebooks,sklearn,RandomForestRegressor(n_jobs = -2)遇到类似的错误。我相信这是因为某个函数大量使用了pickle,但不确定真正的原因。在[this](https://www.kaggle.com/getting-started/45288)答案之后,我在Python笔记本中写了“%env JOBLIB_TEMP_FOLDER = / tmp”,一切都很好。我不确定这是否有用或有人可以扩展。 (2认同)

小智 12

尝试删除临时文件

cd /tmp/
rm -r *
Run Code Online (Sandbox Code Playgroud)

  • 严重使用`cd`后跟`rm` (12认同)
  • 这个答案被低估了-其他答案本质上是在说:“垃圾太多了?拿一个更大的垃圾桶!当这个答案正在清除垃圾时。 (5认同)

jos*_*osh 10

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

  • 这里问题的原因似乎是inode /目录条目......(而且它似乎是特定于vfat)这在问题中没有明显(没有评论)(这个答案主要提供了一种解决方法,这是在许多情况下不实用...)(你也没有指定它是否再次使用vfat格式化,或者是不同的文件系统......) (4认同)
  • 我有同样的问题.如果人们用他们的downvotes留下解释会很好. (3认同)
  • 您不能总是重新格式化。重组始终是一个显而易见的解决方案。您不需要将数据保留在设备上吗???这是投反对票的一个原因。 (3认同)

Pat*_*Old 8

  1. 显示内存分配位置sudo du -x -h / | sort -h | tail -40
  2. 如果它们占用大量内存,请从您的/tmp或文件夹中删除。/home/user_name/.cache你可以通过运行来做到这一点sudo rm -R /path/to/folder

步骤 2 概述了要从中删除的相当常见的文件夹 (/tmp/home/user_name/.cache)。如果您在运行第一个命令时得到其他结果,显示您有大量内存正在其他地方使用,我建议从这些位置删除时要更加谨慎。


ARK*_*han 5

就我而言,当我运行df -i 时,它显示我的 inode 数已满,然后我必须删除一些小文件或文件夹。否则,一旦 inode 已满,我们将无法创建文件或文件夹。

您所要做的就是删除尚未占用全部空间但负责填充 inode 的文件或文件夹。