首页 > 解决方案 > 内核因 bw2analyzer.traverse_tagged_databases 而死

问题描述

bw2analyzer.traverse_tagged_databases根据 此答案的建议,我在使用该功能时遇到了一些问题。我想bw2analyzer.traverse_tagged_databases在标签上应用这个功能。我已确保我正在评估的活动(my_act在下文中)具有标签,然后一些输入交换具有标签(但不是全部),并且输入交换的一些输入交换具有标签(不是全部) . 这是我所做的(省略一些定义行):

import bw2analyzer as bw2analyzer
ipcc2013 = ('IPCC 2013', 'climate change', 'GWP 100a')
fu = {my_act:1}
lca_calc = bw.LCA(fu,ipcc2013)
lca_calc.lci()
lca_calc.lcia()
result, tree = bw2analyzer.traverse_tagged_databases(fu, ipcc2013, label='tag',default_tag='other')

当我这样做时,内核会死掉(确切的消息:Kernel died, restarting。我正在使用 Spyder v3.3.1、brightway2 v2.3、bw2analyzer v0.9.4)然后它会无限期地运行。我是否正确使用该功能?我错过了什么?那对你有用吗?谢谢您的帮助!

标签: python-3.xbrightway

解决方案


我找到了一种解决方案,使该bw2analyzer.traverse_tagged_databases功能在用于大型数据库(例如 ecoinvent)时可以正常工作。tagged.recurse_tagged_database我通过实现计算深度(即应用递归函数的最大深度)并在达到深度时交替结果来重写函数。这是我的代码(我从原始函数中删除了一些行,因为我只使用一个数据库):

def recurse_tagged_database(activity, amount, method_dict, lca, label, default_tag, secondary_tags=[],product_system_depth=5):
    from bw2data import get_activity
    if isinstance(activity, tuple):
        activity = get_activity(activity)
    inputs = list(activity.technosphere())
    if(product_system_depth > 0):
        return {
            'activity': activity,
            'amount': amount,
            'tag': activity.get(label) or default_tag,
            'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
            'impact': 0,
            'biosphere': [{
                'amount': exc['amount'] * amount,
                'impact': exc['amount'] * amount * method_dict.get(exc['input'], 0),
                'tag': exc.get(label) or activity.get(label) or default_tag,
                'secondary_tags':[exc.get(t[0]) or activity.get(t[0]) or t[1] for t in secondary_tags]
            } for exc in activity.biosphere()],
            'technosphere': [recurse_tagged_database(exc.input, exc['amount'] * amount,
                                                     method_dict, lca, label,exc.get(label) or activity.get(label) or default_tag, secondary_tags,product_system_depth=product_system_depth-1)
                             for exc in inputs]
        }
    else:
        return {
            'activity': activity,
            'amount': amount,
            'tag': activity.get(label) or default_tag,
            'secondary_tags':[activity.get(t[0]) or t[1] for t in secondary_tags],
            'impact': redo_lca_score(lca,{activity:amount}),
            'biosphere': [],
            'technosphere': []
        }

注释:

  • default_tag在将递归函数应用于exc.get(label) or activity.get(label) or default_tag. 实际上,就我而言,如果没有标签,我希望默认情况下将交换的影响与父活动的标签相关联。
  • 就我而言,5 的深度足以得到我想要的。这已经需要一些时间了。

推荐阅读