Python вызывает: IOError: [Errno 28] Нет места на устройстве: «../results/32766.html» на диске с большим количеством места - PullRequest
24 голосов
/ 09 августа 2011

Я использую скрипт Python, который вызывает вышеуказанную ошибку. Необычная вещь заключается в том, что этот скрипт выполняется на другом компьютере и не имеет проблем.

Разница в том, что на машине, которая вызывает проблемы, я пишу на внешний жесткий диск. Чтобы сделать вещи еще более странными, этот скрипт был запущен на проблемной машине и уже записал более 30000 файлов.

Некоторая важная информация (код, вызывающий ошибку):

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

Некоторые вещи, которые я пробовал:

  • Изменение пути записи в прямое местоположение вместо перехода по ссылке
  • Перезагрузка машины
  • Разборка и повторная установка привода

Ответы [ 4 ]

40 голосов
/ 09 августа 2011

Ошибка ENOSPC («На устройстве не осталось места») будет вызвана в любой ситуации, когда данные или метаданные , связанные с операцией ввода-вывода, могут нигде не записывайся из-за недостатка места. Это не всегда означает дисковое пространство - это может означать физическое дисковое пространство, логическое пространство (например, максимальную длину файла), пространство в определенной структуре данных или адресном пространстве. Например, вы можете получить его, если в таблице каталогов нет места (vfat) или не осталось никаких инодов. Это примерно означает «я не могу найти, где это записать».

В частности, в Python это может происходить при любой операции записи ввода-вывода. Это может произойти во время f.write, но также может произойти в open, f.flush и даже f.close. То, где это произошло, дает важную подсказку по той причине, что это произошло - если это произошло в open, не хватило места для записи метаданных для записи, если это произошло во время f.write, f.flush или f.close недостаточно места на диске или превышен максимальный размер файла.

Если файловой системой в данном каталоге является vfat, вы достигнете максимального размера файла примерно в то же время, что и вы. Предполагается, что предел составляет 2 ^ 16 записей каталога, но, если я правильно помню, некоторые другие факторы могут повлиять на него (например, для некоторых файлов требуется более одной записи).

Лучше всего избегать создания такого количества файлов в каталоге. Немногие файловые системы легко справляются с таким количеством записей каталога. Если вы не уверены, что ваша файловая система хорошо работает со многими файлами в каталоге, вы можете рассмотреть другую стратегию (например, создать больше каталогов).

P.S. Также не доверяйте оставшемуся дисковому пространству - некоторые файловые системы резервируют некоторое место для root, а другие просчитывают свободное пространство и дают вам число, которое просто не соответствует действительности.

11 голосов
/ 03 февраля 2016

Попробуйте удалить временные файлы

cd /tmp/
rm -r *
8 голосов
/ 02 октября 2011

Оказалось, что лучшим решением для меня было просто переформатировать накопитель.После переформатирования все эти проблемы больше не были проблемами.

2 голосов
/ 18 мая 2018

В моем случае, когда я запускаю df -i , это показывает, что мое число inode заполнено, и затем мне нужно удалить некоторые из небольших файлов или папок.В противном случае это не позволит нам создавать файлы или папки после заполнения инодов.

Все, что вам нужно сделать, - это удалить файлы или папки, которые не занимают полное пространство, но отвечают за заполнение инодов.

...