Причина Python: IOError: [Errno 28] На устройстве не осталось места: '../results/32766.html' на диске с большим количеством места

Я запускаю сценарий 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)

Каталог, в который я пишу:

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

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

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

person josh    schedule 09.08.2011    source источник
comment
Что это за файловая система /media/cavalry? Может быть, вы могли бы опубликовать соответствующую строку от /proc/mounts. У вас просто заканчиваются inodes?   -  person Sven Marnach    schedule 09.08.2011
comment
Было бы полезно, если бы вы включили полную трассировку (в какой строке произошла ошибка?), Типы файловых систем и количество свободных индексных узлов (df -i). В этом случае я подозреваю, что файловая система vfat, и вы превысили максимальное количество файлов в каталоге.   -  person Rosh Oxymoron    schedule 09.08.2011
comment
@Rosh - +1 - видите, что имя файла 32766 - это число вызывает тревогу :) Кстати, вы должны переместить свой комментарий в ответы   -  person KevinDTimm    schedule 09.08.2011
comment
32766+. + .. для 32768 записей в справочнике. Хм...   -  person wberry    schedule 09.08.2011
comment
@Rosh Да, индексных дескрипторов больше нет. Интересный. Рош, если вы разместите свой комментарий к ответу, я могу указать это как вариант. Но мне также интересно, что я могу сделать, чтобы исправить это, и где я могу получить дополнительную информацию об индексных дескрипторах в системе vfat. Спасибо!   -  person josh    schedule 09.08.2011
comment
Хорошо, я хотел опубликовать это с последним комментарием: ‹br› Inodes файловой системы IUsed IFree IUse% Mounted on ‹br› / dev / sdc10 0 0 0 - / media / cavalry ‹br› Кажется странным, что там нет Inodes на все. Определенно vfat: ‹br› / dev / sdc10 / media / cavalry vfat rw, nosuid, nodev, noexec, relatime, uid = 1001, gid = 1001, fmask = 0113, dmask = 0000, allow_utime = 0022, codepage = cp437, iocharset = iso8859-1, короткое имя = смешанное, ошибки = remount-ro 0 0   -  person josh    schedule 09.08.2011
comment
У меня аналогичная ошибка в python3.7.4, Centos 7.7.1908。 Я запускаю код в ipython, выдает ошибку, но интерпретатор ipython не дает сбой. затем я проверяю емкость диска и индексный дескриптор с помощью df -hi. Эти параметры в порядке. Затем используйте lsof +L1 и нахожу множество дескриторов файлов, у которых NLINK равно 0, так как я удалил открытый файл напрямую, они будут продолжать использовать диск, пока процесс не завершится. df не показывает правильное сообщение, потому что он читает суперблок с диска, поэтому вы можете выйти из процесса или изменить код, особенно файловые дескрипторы。   -  person libin    schedule 09.12.2019


Ответы (7)


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

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

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

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

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

person Rosh Oxymoron    schedule 09.08.2011
comment
Во-первых, это происходит на открытой линии. Во-вторых, я хочу опубликовать это с моим последним комментарием: Inodes файловой системы IUsed IFree IUse% Mounted on / dev / sdc10 0 0 0 - / media / cavalry. Итак, похоже, что у меня нет Inodes, но я их не использую. Что касается создания большего количества каталогов, разве это не решит проблему? Скажем, мое дерево - / estc / results30000 / и estc / results60000 /. Если я помещу первые 30000 в results30000, а следующие 30000 в результаты 60000, в каталоге estc / по-прежнему будет слишком много файлов. Я тоже уверен на свободном месте - person josh; 09.08.2011
comment
Я получил ту же ошибку во время операции записи файла (загрузки) в скрипте Python. Inodes, а также дисковое пространство были очень доступны. Мне удалось успешно запустить скрипт Python на другой машине, и когда я вручную скопировал его на первую машину, копия была успешной. Я не понимаю, как это сработало, если проблема была связана с превышением максимального размера файла, максимального количества каталогов / файлов или любых других ограничений физического диска. Любая дополнительная информация будет очень полезна, так как я могу снова столкнуться с этой проблемой. - person gvas; 09.09.2016
comment
У меня аналогичная ошибка при использовании Python 3, Jupyter Notebooks, sklearn, RandomForestRegressor (n_jobs = -2). Я считаю, что это произошло потому, что функция часто использовала рассол, но не уверен в истинной причине. После этого ответа я написал %env JOBLIB_TEMP_FOLDER=/tmp в записной книжке Python и все в порядке. Я не уверен, полезно ли это здесь или кто-то может расширить его. - person Rafael Valero; 23.08.2018
comment
Это давний ответ, но я постараюсь задать его независимо (не хочу открывать повторяющийся вопрос). Я получил ту же ошибку во время np.save() в настройке, которая повторяется во множестве случаев. Ошибка возникла примерно после 1,5 тыс. Итераций, и на диске осталось 150 ГБ, поэтому я не знаю, что с этим делать. - person Puff; 25.02.2021
comment
Я хочу добавить еще одну потенциальную причину ENOSPC, с которой я столкнулся. Я работаю над управляемыми экземплярами Linux, и есть квота с жестким ограничением для «домашнего» каталога. Conda использует ~ / .conda для хранения пакетов. В конце концов, я не смог использовать conda create ..., так как это давало сообщение «на устройстве не осталось места», но не было никаких указаний на то, что пошло не так. Дисковое пространство, индексные дескрипторы и т. Д. Все выглядело нормально. Я понял это только тогда, когда мой ~ / .bashrc был усечен, когда я попробовал 'conda init'. Очистка пакетов ~ / .conda исправила это. - person Wesley R. Elsberry; 12.03.2021

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

rm -r /tmp/
person user309866    schedule 03.02.2016
comment
Опасное использование cd, за которым следует rm - person Gert van den Berg; 18.10.2017
comment
Этот ответ недооценен - ​​другие ответы по сути говорят о том, что слишком много мусора? Возьмите мусорное ведро побольше! Пока этот ответ выносит мусор. - person Benjamin James; 23.02.2018
comment
есть ли способ ответить «да» на все вопросы, если я уверен? - person Akin Hwan; 25.06.2019
comment
Это лучший из всех возможных ответов. Примечание: рекомендуется давать да / нет y или n для каждого каталога Temp, чтобы избежать удаления файлов / каталогов других пользователей в ubuntu! - person Vetrivel PS; 07.08.2019

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

person josh    schedule 02.10.2011
comment
У меня такой же вопрос. Было бы неплохо, если бы люди оставили объяснение со своими голосами против. - person josh; 14.02.2017
comment
Причиной проблемы здесь, похоже, были записи inodes / directory ... (и, похоже, это было специфично для vfat) Это неочевидно в вопросе (без комментариев) (и этот ответ в основном предоставляет обходной путь, который не практично во многих случаях ...) (Вы также не указали, был ли он снова отформатирован с помощью vfat или другой файловой системы ...) - person Gert van den Berg; 19.10.2017

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

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

person ARKhan    schedule 18.05.2018

запустите "export TEMPDIR = / someDir", где some dir является допустимым каталогом, отличным от / tmp. Запустите это в командной строке, прежде чем запускать команду python. В моем случае это «pip install rasa [spacy]», который ранее не работал.

Команда экспорта позволяет вам временно использовать указанный каталог как временный каталог.

person Chandan    schedule 03.10.2019
comment
Я думаю, что это должен быть TMPDIR, а не TEMPDIR, согласно docs.python.org /3/library/tempfile.html#tempfile.mkstemp - также, по-видимому, также проверяются TEMP и TMP. - person Gord Stephen; 26.11.2019

  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). Если при запуске первой команды вы получаете другие результаты, показывающие, что у вас много памяти, используемой в другом месте, я советую быть немного более осторожным при удалении из этих мест.

person Colonel_Old    schedule 05.11.2020

Я столкнулся с подобной проблемой. Вышеупомянутые решения для удаления каталога / tmp сработали для меня.

Вместо того, чтобы использовать расположение по умолчанию / tmp, где учетная запись службы может не иметь полного доступа (если следовать лучшим практикам и не использовать sudo для установки пакетов Python), я переместил каталог / tmp в домашний каталог пользователя, с учетом настройки среды TMPDIR pip install --user ... команда.

Я столкнулся с проблемой нехватки места, как упоминалось в ответах выше, скорее всего, из-за того, что создается так много файлов / каталогов, которые фактически не исчерпывают объем хранилища. Для меня сработало решение удалить каталог / home / ‹some_domain› / $ USER / tmp и воссоздавать его каждый раз при запуске моего конвейера непрерывного развертывания. rm -rf /tmp

person H A    schedule 25.03.2021