我正在尝试使用python/pyfmi和多进程并行模拟多个Modelica FMU。但是,一旦FMU被初始化,我就无法从子进程返回任何pyfmi FMI对象。似乎pyfmi FMI对象(例如pyfmi.fmi.FMUModelCS2或pyfmi.fmi.FMUState2)是不可拾取的。我也尝试过腌菜,但这对我来说不起作用。使用dill,对象是可拾取的,这意味着没有错误,但如果我后来尝试重新加载它们,不知何故就会损坏。有谁知道如何解决这个问题吗?谢谢!
发布于 2016-11-11 16:31:04
问题是,pyfmi.fmiFMUModelCS2是一个依赖于外部库的Cython类,这使得它不可拾取。所以不幸的是这是不可能的。
如果您想使用多处理,我看到的唯一方法是首先创建进程,然后将FMU加载到单独的进程中。通过这种方式,您不需要对类进行筛选。
发布于 2016-11-12 00:57:58
我在创建EstimationPy时也遇到过类似的问题。我最终创建了一个包装器,用于使用多个进程运行同一FMU的并行模拟。
我建议您在这里查看https://github.com/lbl-srg/EstimationPy/blob/master/estimationpy/fmu_utils/fmu_pool.py的实现
和示例http://lbl-srg.github.io/EstimationPy/modules/examples/first_order.html#run-multiple-simulations
发布于 2016-12-05 16:35:04
pathos模块允许使用与multiprocessing类似的接口进行多处理,但它依赖于dill而不是pickle进行序列化。如果结果在内存中处理,则Pool方法适用于model.simulate的并行执行:
n_core = 2
n_simulation = 10
# ====
import pyfmi
model = pyfmi.load_fmu(path_fmu)
def worker(*args):
model.reset()
print "================> %d" % args[0]
return model.simulate(options=dict(result_handling="memory"))["y"]
from pathos.multiprocessing import Pool
pool = Pool(n_core)
out = pool.map(worker, range(n_simulation))
pool.close()
pool.join()注意,在上面的代码片段中,有必要在memory:options=dict(result_handling="memory")中处理结果。默认情况下,使用临时文件,该文件适用于模拟量较小的情况。然而,排队的时间越长,得到如下内容的机会就越高。
Exception in thread Thread-27:
Traceback (most recent call last):
File "/home/USER/anaconda2/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/home/USER/anaconda2/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/USER/anaconda2/lib/python2.7/site-packages/multiprocess/pool.py", line 389, in _handle_results
task = get()
File "/home/USER/anaconda2/lib/python2.7/site-packages/dill/dill.py", line 260, in loads
return load(file)
File "/home/USER/anaconda2/lib/python2.7/site-packages/dill/dill.py", line 250, in load
obj = pik.load()
File "/home/USER/anaconda2/lib/python2.7/pickle.py", line 864, in load
dispatch[key](self)
File "/home/USER/anaconda2/lib/python2.7/pickle.py", line 1139, in load_reduce
value = func(*args)
TypeError: __init__() takes exactly 2 arguments (1 given)我没能理解。
https://stackoverflow.com/questions/40511920
复制相似问题