web-dev-qa-db-fra.com

Python provoquant: IOError: [Errno 28] Il n'y a plus d'espace sur le périphérique: '../results/32766.html' sur le disque avec beaucoup d'espace

J'exécute un script Python qui provoque l'erreur ci-dessus. La chose inhabituelle est que ce script s'exécute sur une machine différente et n'a aucun problème.

La différence est que sur la machine qui cause les problèmes que j'écris sur un disque dur externe. Pour rendre les choses encore plus étranges, ce script a été exécuté sur la machine à problème et a déjà écrit plus de 30 000 fichiers.

Quelques informations pertinentes (le code à l'origine de l'erreur):

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)

Le répertoire dans lequel j'écris:

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

Preuve qu'il y a assez d'espace:

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

Certaines choses que j'ai essayées:

  • Changer le chemin de l'écriture vers l'emplacement direct au lieu de passer par le lien
  • Redémarrage de la machine
  • Démontage et remontage du lecteur
25
josh

Il s'avère que la meilleure solution pour moi ici était de simplement reformater le lecteur. Une fois reformatés, tous ces problèmes n'étaient plus des problèmes.

8
josh

L'erreur ENOSPC ("Il ne reste plus d'espace sur le périphérique") sera déclenchée dans tout situation dans laquelle les données ou les métadonnées associées à une E/S l'opération ne peut être notée nulle part en raison du manque d'espace. Cela ne signifie pas toujours de l'espace disque - cela pourrait signifier de l'espace disque physique, de l'espace logique (par exemple la longueur maximale d'un fichier), de l'espace dans une certaine structure de données ou un espace d'adressage. Par exemple, vous pouvez l'obtenir s'il n'y a pas d'espace dans la table de répertoire (vfat) ou s'il n'y a plus d'inodes. Cela signifie à peu près "Je ne trouve pas où écrire cela".

En particulier en Python, cela peut se produire sur n'importe quelle opération d'E/S d'écriture. Cela peut arriver pendant f.write, mais cela peut aussi arriver sur open, sur f.flush et même f.close. L'endroit où cela s'est produit fournit un indice essentiel pour la raison pour laquelle cela s'est produit - si cela s'est produit sur open il n'y avait pas assez d'espace pour écrire les métadonnées pour l'entrée, si cela s'est produit pendant f.write, f.flush ou f.close il n'y avait pas assez d'espace disque ou vous avez dépassé la taille de fichier maximale.

Si le système de fichiers dans le répertoire donné est vfat, vous atteindriez la limite maximale de fichiers à peu près au même moment que vous. La limite est censée être de 2 ^ 16 entrées de répertoire, mais si je me souviens bien, d'autres facteurs peuvent l'affecter (par exemple, certains fichiers nécessitent plus d'une entrée).

Il serait préférable d'éviter de créer autant de fichiers dans un répertoire. Peu de systèmes de fichiers gèrent autant d'entrées de répertoire avec facilité. À moins d'être certain que votre système de fichiers gère bien de nombreux fichiers dans un répertoire, vous pouvez envisager une autre stratégie (par exemple, créer plus de répertoires).

P.S. Ne faites pas non plus confiance à l'espace disque restant - certains systèmes de fichiers réservent de l'espace pour root et d'autres calculent mal l'espace libre et vous donnent un nombre qui n'est tout simplement pas vrai.

41
Rosh Oxymoron

Essayez de supprimer les fichiers temporaires

cd /tmp/
rm -r *
12
user309866

Dans mon cas, lorsque j'exécute df -i cela me montre que mon nombre d'inodes est plein et ensuite je dois supprimer certains des petits fichiers ou dossiers. Sinon, cela ne nous permettra pas de créer des fichiers ou des dossiers une fois que les inodes seront pleins.

Tout ce que vous avez à faire est de supprimer les fichiers ou dossiers qui n'ont pas pris tout l'espace mais qui sont chargés de remplir les inodes.

2
ARKhan