2

モジュールを使用して、学校のコンピューターでスクリプトを実行していmultiprocessingます。データを頻繁にシリアライズしています。以下のコードで要約できます。

import multiprocessing as mp
import time, pickle

def simulation(j):
    data = []
    for k in range(10):
        data.append(k)
        time.sleep(1)
        file = open('data%d.pkl'%j, 'wb')
        pickle.dump(data, file)
        file.close()
if __name__ == '__main__':
    processes = []
    processes.append(mp.Process(target = simulation, args = (1,) ))
    processes.append(mp.Process(target = simulation, args = (2,) ))
    for process in processes:
        process.start()
    for process in processes:
        process.join()

そのため、実際にコードをさらに多くのシミュレーションで実行し、より集中的なさまざまなタスクであると想像すると、次のエラーが発生します。IOError: [Errno 5] Input/output error通常、file.open(...)またはが前に付いていfile.close()ます。

私の質問:

  • スクリプトでこのエラーを修正するにはどうすればよいですか?
  • このエラーは Python 初心者にとって何を意味しますか? 参考にさせていただきます。

私の手順に関するいくつかの注意事項:

  • multiprocess 属性daemonをに設定する代わりにTrue、screen を使用してスクリプトを実行し、デタッチします。これにより、スクリプトが停止することを心配せずに切断することもできます。
  • これは、モジュールを使用した印刷に関する関連する質問のようです。subprocess私が言ったようにデーモンを明示的に使用しなかったので、これが役立つかどうかはわかりません。
  • これは通常、約 1 日実行した後に発生し、さまざまなプロセスでさまざまな時間に発生します。
4

1 に答える 1

2

あなたのプログラムはかなり良さそうです。この場合IOError、単に「悪いことが起こった」という意味です。シミュレートされたデータのセット全体が Python プロセスに対して大きくなりすぎたため、不可解なメッセージで終了しました。

次のバージョンでのいくつかの改善:

  • データが生成されたら、それをデータ ファイルに追加し、メモリから消去します。プログラムの RAM の使用量は、時間の経過とともにほぼ同じになるはずです。

  • 便利なことに、ファイルがオブジェクトの連結であるpickle場合、後で詳しく調べるために各オブジェクトを簡単に印刷できます。コード例を示します。

楽しむ!

ソース

import multiprocessing as mp
import glob, time, pickle, sys

def simulation(j):
    for k in range(10):
        datum = {'result': k}
        time.sleep(1)
        with open('data%d.pkl'%j, 'ab') as dataf:
            pickle.dump(datum, dataf)

def show():
    for datname in glob.glob('data*.pkl'):
        try:
            print '*'*8, datname
            with open(datname, 'rb') as datf:
                while True:
                    print pickle.load(datf)
        except EOFError:
            pass

def do_sim():
    processes = []
    processes.append(mp.Process(target = simulation, args = (1,) ))
    processes.append(mp.Process(target = simulation, args = (2,) ))
    for process in processes:
        process.start()
    for process in processes:
        process.join()

if __name__ == '__main__':
    if '--show' in sys.argv:
        show()
    else:
        do_sim()

「python ./msim.py --show」の出力

******** data2.pkl
{'result': 0}
{'result': 1}
{'result': 2}
{'result': 3}
{'result': 4}
{'result': 5}
{'result': 6}
{'result': 7}
{'result': 8}
{'result': 9}
******** data1.pkl
{'result': 0}
{'result': 1}
{'result': 2}
{'result': 3}
{'result': 4}
{'result': 5}
{'result': 6}
{'result': 7}
{'result': 8}
{'result': 9}
于 2014-10-04T03:13:53.950 に答える