gpt4 book ai didi

Python 多处理和序列化数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:01 25 4
gpt4 key购买 nike

我正在使用 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 新手意味着什么?推荐引用。

关于我的程序的更多说明:

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

最佳答案

你的程序看起来不错。在这种情况下,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}

关于Python 多处理和序列化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25924397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com