Python causa: IOError:[Errno 28] No queda espacio en el dispositivo: ''../results/32766.html'' en el disco con mucho espacio
filesystems hard-drive (4)
El ENOSPC
("No queda espacio en el dispositivo") se activará en cualquier situación en la que los datos o los metadatos asociados con una operación de E / S no se puedan escribir en ninguna parte debido a la falta de espacio. Esto no siempre significa espacio en el disco: puede significar espacio en el disco físico, espacio lógico (por ejemplo, longitud máxima de archivo), espacio en una determinada estructura de datos o espacio de direcciones. Por ejemplo, puede obtenerlo si no hay espacio en la tabla de directorio (vfat) o si no quedan inodos. En términos generales, significa "No puedo encontrar dónde escribir esto".
Particularmente en Python, esto puede suceder en cualquier operación de E / S de escritura. Puede suceder durante f.write
, pero también puede ocurrir en open
, en f.flush
e incluso en f.close
. Donde sucedió, proporciona una pista vital por la razón por la que sucedió: si sucedió en open
no hubo suficiente espacio para escribir los metadatos para la entrada, si sucedió durante f.write
, f.flush
o f.close
no hubo No queda suficiente espacio en el disco o ha excedido el tamaño máximo de archivo.
Si el sistema de archivos en el directorio dado es vfat
, alcanzaría el límite máximo de archivos aproximadamente al mismo tiempo que lo hizo. Se supone que el límite es 2 ^ 16 entradas de directorio, pero si recuerdo correctamente algunos otros factores pueden afectarlo (por ejemplo, algunos archivos requieren más de una entrada).
Sería mejor evitar la creación de tantos archivos en un directorio. Pocos sistemas de archivos manejan tantas entradas de directorio con facilidad. A menos que esté seguro de que su sistema de archivos trata bien con muchos archivos en un directorio, puede considerar otra estrategia (por ejemplo, crear más directorios).
PD: Tampoco confíe en el espacio de disco restante: algunos sistemas de archivos reservan un espacio para la raíz y otros calculan mal el espacio libre y le dan un número que simplemente no es cierto.
Estoy ejecutando una secuencia de comandos de Python que está causando el error anterior. Lo inusual es que este script se ejecuta en una máquina diferente y no tiene problemas.
La diferencia es que en la máquina que está causando los problemas, estoy escribiendo en un disco duro externo. Para hacer las cosas aún más extrañas, este script se ha ejecutado en la máquina problemática y ya ha escrito más de 30,000 archivos.
Alguna información relevante (El código que está causando el error):
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)
El directorio al que estoy escribiendo:
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
Prueba de que hay suficiente espacio:
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
Algunas cosas que he intentado:
- Cambiar la ruta de la escritura a la ubicación directa en lugar de pasar por el enlace
- Reiniciando la maquina
- Desmontaje y montaje de la unidad.
En mi caso, cuando ejecuto df -i , me muestra que mi número de inodos está lleno y luego tengo que eliminar algunos de los archivos o carpetas pequeños. De lo contrario, no nos permitirá crear archivos o carpetas una vez que los inodos se llenen.
Todo lo que tiene que hacer es eliminar archivos o carpetas que no hayan ocupado todo el espacio pero que sean responsables de completar los inodos.
Intenta borrar los archivos temporales
cd /tmp/
rm -r *
Resulta que la mejor solución para mí aquí fue simplemente reformatear el disco. Una vez reformateados todos estos problemas ya no eran problemas.