0

データを生成してデータベースに書き込むループがあります。

myDatabase = Database('myDatabase')
for i in range(10):
    #some code here that generates dictionaries that can be saved as activities
     myDatabase.write({('myDatabase', 'valid code'): activityDict})

このようにして作成された単一のアクティビティは、データベースに保存できます。ただし、複数作成する場合、データベースの長さは常に 1 であり、最後のアクティビティのみがデータベースに到達します。

非常に大きなデータセットがたくさんあるので、それらすべてを 1 つの辞書に格納して一度にデータベースに書き込むのは便利ではありません。

アクティビティを既存のデータベースに段階的に追加する方法はありますか?

4

1 に答える 1

1

通常のアクティビティ書き込み

Database.write()データベース全体を置き換えます。最善の方法は、Python でデータベースを作成してから、すべてを記述することです。

data = {}
for i in range(10):
    # some code here that generates data
    data['foo'] = 'bar'
Database('myDatabase').write(data)

データセットを動的に生成する

ただし、既存のデータベースから集約されたデータセットを動的に作成する場合は、カスタム ジェネレーターで個々のデータセットを作成できます。このジェネレーターは、以下をサポートする必要があります。

  • __iter__: データベース キーを返します。各データセットが書き込まれているデータベースに属していることを確認するために使用されます。したがって、最初の要素を返すだけで済みます。
  • __len__: 書き込むデータセットの数。
  • keys: にキーを追加するために使用しますmapping
  • values: にアクティビティの場所を追加するために使用されgeomappingます。ソース データベースと集約されたシステム データベースの場所は同じであるため、ここでは元のデータセットのみを指定できます。
  • items: 新しいキーとデータセット。

コードは次のとおりです。

class IterativeSystemGenerator(object):
    def __init__(self, from_db_name, to_db_name):
        self.source = Database(from_db_name)
        self.new_name = to_db_name
        self.lca = LCA({self.source.random(): 1})
        self.lca.lci(factorize=True)

    def __len__(self):
        return len(self.source)

    def __iter__(self):
        yield ((self.new_name,))

    def get_exchanges(self):
        vector = self.lca.inventory.sum(axis=1)
        assert vector.shape == (len(self.lca.biosphere_dict), 1)
        return [{
                    'input': flow,
                    'amount': float(vector[index]),
                    'type': 'biosphere',
                } for flow, index in self.lca.biosphere_dict.items()
                if abs(float(vector[index])) > 1e-17]

    def keys(self):
        for act in self.source:
            yield (self.new_name, act['code'])

    def values(self):
        for act in self.source:
            yield act

    def items(self):
        for act in self.source:
            self.lca.redo_lci({act: 1})
            obj = copy.deepcopy(act._data)
            obj['database'] = self.new_name
            obj['exchanges'] = self.get_exchanges()
            yield ((self.new_name, obj['code']), obj)

そして使用法:

new_name = "ecoinvent 3.2 cutoff aggregated"
new_data = IterativeSystemGenerator("ecoinvent 3.2 cutoff", new_name)
Database(new_name).write(new_data)            

このアプローチの制限

非常に多くのデータセットまたはデータセット内の交換を作成していて、メモリの問題が発生している場合は、間違ったツールを使用している可能性もあります。データベース テーブルとマトリックス ビルダーの現在のシステムは、スパース マトリックスを使用します。この場合、密行列の方がはるかに理にかなっています。たとえば、IO テーブル バックエンドはデータベースを完全にスキップし、処理済みの配列を書き込むだけです。13.000 * 1.500 = 20.000.000 のエントリがある場合、生物圏マトリックスの読み込みと作成に時間がかかります。この特定のケースでは、私の最初の本能は、次のいずれかを試すことです。

  • 生物圏フローをデータベースに書き込むのではなく、集計プロセスごとに個別に保存し、インベントリ計算後に追加します。
  • 集約されたシステム プロセスごとに個別のデータベースを作成します。
于 2016-07-14T21:24:53.620 に答える