2

さて、データをメモリに書き込む関数があります。データを設定されたサイズ(この場合は1 GB)に設定してから、ファイルに切り捨て/ダンプし、書き込むデータがなくなるまでこのプロセスを続行しようとしています。現在、制限に達して切り捨てられ、関数の終了方法に応じて次のエラーのいずれかで失敗します。

Traceback (most recent call last):
  File "<pyshell#192>", line 1, in <module>
    cart_for(10,'1234567890')
  File "<pyshell#191>", line 8, in cart_for
    x.write(''.join(p))
ValueError: I/O operation on closed file

私の機能は次のとおりです。

x = StringIO()
def cart_for(n, seq):
b = 8
a = 100000
size_max = 1073741824
for m in range(n, b, -1):
    a = a - 1
    for p in itertools.product(seq, repeat=m-1):
        x.write(''.join(p))
        x.write('\n')
        x.seek(0, os.SEEK_END)
        size = x.tell()
        if size > size_max:
            with open('C:/out/' + ran(8,string.ascii_letters) + '.txt', 'w') as handle:
                handle.write(x.getvalue())
                x.close()
                x

関数を次のように終了した場合:

x = StringIO()

それ以外の:

x

エラーは次のとおりです。

Traceback (most recent call last):
  File "<pyshell#189>", line 1, in <module>
    cart_for(10, '1234567890')
  File "<pyshell#188>", line 8, in cart_for
    x.write(''.join(p))
UnboundLocalError: local variable 'x' referenced before assignment

このプロセスを完了する方法について何かアイデアはありますか?参考までに、メモリのスペースが不足しないように、メモリをディスクに頻繁に切り捨てて、関数が完了するまで実行を継続できるようにしたいと考えている方も多いと思います。これを完了するために静的変数によって定義された確率変数名を作成することは可能ですか(それが理にかなっている場合)?許してください私はPythonを初めて使用します。

4

1 に答える 1

1

ループで使用xしていますが、最初に最大サイズに達したときに閉じます。次回ループが発生すると、StringIOは閉じられ、使用できなくなります。

StringIOは、関数の外側ではなく、関数の内側に作成する必要があります。x = StringIO()関数本体の内側(ループの前)を移動し、最後の行をに変更x = StringIO()して、古い行を埋めるたびに新しいStringIOを作成するようにします。

于 2012-12-25T04:01:15.740 に答える