关于io:Python多处理和序列化数据

Python Multiprocessing and Serializing Data

我正在使用multiprocessing模块在学校计算机上运行脚本。我经常序列化数据。可以通过以下代码进行总结:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 newcomer意味着什么?参考文献赞赏。

关于我的程序的一些注意事项:

  • 我没有将多进程属性daemon设置为True,而是使用屏幕运行脚本然后分离。这允许我也断开连接而不用担心我的脚本停止。
  • 这似乎是关于使用subprocess模块进行打印的相关问题。我没有像我说的那样明确地使用守护进程,所以不确定这是否会有所帮助。
  • 这通常在运行大约一天后发生,并且在不同时间发生在不同的进程上。


你的程序看起来很不错。 在这种情况下,IOError只是意味着"坏事发生了"。 整个模拟数据集对于Python进程变得很大,所以它随着神秘的消息退出。

以下版本中的几项改进:

  • 生成一些数据后,将其附加到数据文件中
    从记忆中消除它。 程序应该具有大致相同的RAM使用时间,而不是越来越多地使用,然后崩溃。

  • 方便的是,如果文件是pickle对象的串联,我们
    可以轻松打印出每一个以供进一步检查。 示例代码显示。

玩得开心!

资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
******** 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}