0

暴走して予期せぬことをする可能性のあるコードをPythonで書いています。これには、非常に大きな配列をディスクに保存しようとしたり、配列に大量のメモリ (システムで物理的に利用可能な量よりも多く) を割り当てようとしたりすることが含まれる場合があります。

次のルールを使用して、Mac OSX 10.7.5 の制限された環境でコードを実行したいと考えています。

  • プログラムは特定の 1 つのディレクトリにのみファイルを書き込むことができます (つまり、このディレクトリの外部にあるファイルを変更することはできませんが、外部からファイルを読み取ることはできます)。
  • ディレクトリには最大の「容量」があるため、プログラムはギガバイトに相当するデータを保存できません
  • プログラムは限られた量のメモリしか割り当てることができません

そのような制御された環境を設定する方法について誰かアイデアがありますか?

ありがとう。

4

2 に答える 2

0

あなたが望むものを達成するために拡張できるシンプルで素朴なソリューション:

WRITABLE_DIRECTORY = '/full/path/to/writable/directory'


class MaxSizeFile(object):
    def __init__(self, fobj, max_bytes=float('+inf')):
        self._fobj = fobj
        self._max = max_bytes
        self._cur = 0
    def write(self, data):
        # should take into account file position...
        if self._cur + len(data) > self._max:
            raise IOError('The file is too big!')
        self._fobj.write(data)
        self._cur += len(data)
    def __getattr__(self, attr):
        return getattr(self._fobj, attr)


def my_open(filename, mode='r', ..., max_size=float('+inf')):
    if '+' in mode or 'w' in mode:
        if os.path.dirname(filename) != WRITABLE_DIRECTORY:
            raise OSError('Cannot write outside the writable directory.')
    return MaxSizeFile(open(filename, mode, ...), max_size)

次に、代わりにビルトインを使用してopenを呼び出しますmy_open。配列に対しても同じことができます。配列を直接割り当てる代わりに、割り当てられたメモリの量を追跡し、最終的に例外を発生させる関数を呼び出します。

明らかに、これは非常に軽い制約しか与えませんが、プログラムが問題を引き起こすことを目的として書かれていない場合は、それで十分なはずです。

于 2013-07-20T13:48:54.677 に答える
0

OS のインポート

統計 = os.stat('おそらく_big_file.txt')

if (stats.st_size > TOOBIG):
print "ああ、いや....."

于 2013-07-19T21:24:12.990 に答える