首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用pyfmi多进程模拟Modelica FMU

用pyfmi多进程模拟Modelica FMU
EN

Stack Overflow用户
提问于 2016-11-10 00:40:44
回答 3查看 1.1K关注 0票数 4

我正在尝试使用python/pyfmi和多进程并行模拟多个Modelica FMU。但是,一旦FMU被初始化,我就无法从子进程返回任何pyfmi FMI对象。似乎pyfmi FMI对象(例如pyfmi.fmi.FMUModelCS2或pyfmi.fmi.FMUState2)是不可拾取的。我也尝试过腌菜,但这对我来说不起作用。使用dill,对象是可拾取的,这意味着没有错误,但如果我后来尝试重新加载它们,不知何故就会损坏。有谁知道如何解决这个问题吗?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2016-11-11 16:31:04

问题是,pyfmi.fmiFMUModelCS2是一个依赖于外部库的Cython类,这使得它不可拾取。所以不幸的是这是不可能的。

如果您想使用多处理,我看到的唯一方法是首先创建进程,然后将FMU加载到单独的进程中。通过这种方式,您不需要对类进行筛选。

票数 3
EN

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2016-12-05 16:35:04

pathos模块允许使用与multiprocessing类似的接口进行多处理,但它依赖于dill而不是pickle进行序列化。如果结果在内存中处理,则Pool方法适用于model.simulate的并行执行:

代码语言:javascript
复制
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")中处理结果。默认情况下,使用临时文件,该文件适用于模拟量较小的情况。然而,排队的时间越长,得到如下内容的机会就越高。

代码语言:javascript
复制
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)

我没能理解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40511920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档