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:
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.
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.
Essayez de supprimer les fichiers temporaires
cd /tmp/
rm -r *
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.