web-dev-qa-db-ja.com

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

私が試したいくつかのこと:

  • リンクを経由するのではなく、直接の場所への書き込みパスを変更する
  • マシンをリブートする
  • ドライブのアンマウントと再マウント
25
josh

ここで私にとって最良の解決策は、ドライブを再フォーマットすることでした。再フォーマットすると、これらの問題はすべて問題ではなくなりました。

8
josh

ENOSPC(「デバイスにスペースがありません」)エラーは、データまたはメタデータがI/Oに関連付けられているany状況でトリガーされますスペース不足のため、操作をどこにも書き込めません。これは常にディスクスペースを意味するわけではありません。物理ディスクスペース、論理スペース(最大ファイル長など)、特定のデータ構造内のスペース、またはアドレススペースを意味する場合があります。たとえば、ディレクトリテーブル(vfat)にスペースがない場合、またはiノードが残っていない場合に取得できます。大まかに言うと、「これを書き留める場所が見つからない」ということです。

特にPythonでは、これは書き込みI/O操作で発生する可能性があります。 f.write中に発生する可能性がありますが、openf.flush、さらにはf.closeでも発生する可能性があります。 openで発生した場合、f.writef.flush、またはf.closeの間に発生した場合、エントリのメタデータを書き込むための十分なスペースがなかった場合、発生した場所は重大な手がかりを提供します。十分なディスク容量が残っているか、最大ファイルサイズを超えています。

指定されたディレクトリのファイルシステムがvfatである場合、あなたが行ったのとほぼ同時に最大ファイル制限に達します。制限は2 ^ 16のディレクトリエントリと想定されていますが、正しく思い出せば、他のいくつかの要因が影響する可能性があります(たとえば、複数のエントリが必要なファイルもあります)。

ディレクトリに非常に多くのファイルを作成しないようにするのが最善です。非常に多くのディレクトリエントリを簡単に処理できるファイルシステムはほとんどありません。ファイルシステムがディレクトリ内の多くのファイルを適切に処理することが確実でない限り、別の戦略を検討できます(たとえば、ディレクトリをさらに作成します)。

追伸また、残りのディスクスペースを信頼しないでください。一部のファイルシステムはルート用に一部のスペースを予約し、他は空きスペースを誤って計算し、正しくない数値を提供します。

41
Rosh Oxymoron

一時ファイルを削除してみてください

cd /tmp/
rm -r *
12
user309866

私の場合、df -iを実行すると、inodeの数がいっぱいになり、小さなファイルまたはフォルダーの一部を削除する必要があることがわかります。そうしないと、inodeがいっぱいになるとファイルやフォルダーを作成できなくなります。

あなたがしなければならないのは、フルスペースを占有していないが、iノードを埋める責任があるファイルまたはフォルダを削除することです。

2
ARKhan