Python多处理和序列化数据

Python多处理和序列化数据,python,io,daemon,python-multiprocessing,Python,Io,Daemon,Python 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

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

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]输入/输出错误
前面通常是
file.open(…)
file.close()

我的问题是:

  • 如何修复脚本中的此错误
  • 对于python新手来说,这个错误意味着什么?感谢您的推荐
有关我的程序的更多说明:

  • 我没有将多进程属性
    daemon
    设置为
    True
    ,而是使用screen运行脚本,然后分离。这也允许我断开连接,而不用担心脚本停止
  • 这似乎与使用
    子流程
    模块打印有关。正如我所说,我并没有显式地使用守护进程,所以不确定这是否有帮助
  • 这通常发生在运行大约一天之后,并且在不同的进程中不同的时间发生

您的程序看起来不错。在本例中,
IOError
仅表示“发生了不好的事情”。对于Python进程来说,整个模拟数据集变得非常大,因此它带着神秘的消息退出

以下版本中的几个改进:

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

  • 方便地说,如果文件是
    pickle
    对象的串联,那么 以后可以很容易地打印出每一份供进一步检查。显示了示例代码

玩得开心

来源 “python./msim.py--show”的输出
在一位朋友的建议下,我使用bash命令
nohup
而不是
screen
来减少我和内核之间的“层”数量。他粗略地说,这可能会增加这个错误不会出现的可能性。无论如何,它仍然是…非常非常感谢你的回答!我怀疑记忆有问题。追踪这个仍然有困难,但我会再次检查。我到处都在使用类似于Matlab的numpy实现,因此我有很多代码,其中我初始化了一个大数组(~10^3),将数据存储在单个数组条目中,最后在每次迭代后使用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()
******** 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}