2016-10-28 8 views
0

粒子内の濃度の数学的モデルを解く必要があり、ExcelのパラメータはUIです。GCはまだ参照されているオブジェクトを収集します

私は、3つのクラスを持つvb.netのdllライブラリを作成しました:Particle、ParticleMix InteropParticleMix。

粒子の性質に基づく粒子は、単純なオイラー法で次のステップで濃度を計算するサブを持っています。

ParticleMixは、パーティクルの辞書を持つクラスで、混合物中の各パーティクルの質量割合を表すdoubleと、プロパティの加重平均を計算するプロパティです。

InteropParticleMixはParticleMixを継承し、作成時に3つのパーティクルを作成し、3つのフィールドに保存します。 Loadと呼ばれるSubでは、3つのパーティクルをディクショナリにそれぞれの分数で追加します。最後に、各粒子の濃度と平均値を配列に保存する単純なオイラー法で次のステップを呼び出すn回ループする関数です。

VBA-excelから、新しいInteropParticleMixを作成し、すべてのプロパティを挿入し、プロットを作成する変数に格納する反復メソッドを呼び出します。

数学と情報の流れはすべて素晴らしいですが、戻り値がナットとなる時間の30%です。配列の最初の要素は常に動作しますが、ランダムなパーティクルはランダムな点で6553500になります。これは、繰り返し中に1つのパーティクルを収集するGCが原因であると仮定しています。この動作は同じ入力パラメータのため、発散または丸めの問題ではありません。

ループの前後、各ループの前後にあるすべてのパーティクルにGC.KeepAliveメソッドが既に使用されています。どんなライト?

+0

どこかのオーバーフローのような匂い。 VB6/VBAの整数はわずか16ビットです。 – helrich

+2

GCはまだ参照されているものを収集していません。 VBがデフォルトでオンになっているため、オーバーフローが発生する可能性はありません。いずれにせよ、あなたのコードの記述は不十分です。 [MCVE]を投稿してください。 –

+0

@helrich私はそれがオーバーフローではないと確信しています。私が言ったように、入力と同じパラメータは異なる出力を返します。私が観測している値はヌル参照です。 –

答えて

0

見つけました。パフォーマンスを向上させるために、クラスのプロパティの中には、parallel.foreachループを使用してKeys辞書の加重算術平均を計算していました。例:

Public ReadOnly Property Test As Double 
    Get 
     Dim dblTest As Double = 1 

     Parallel.ForEach(MassFractions.Keys, Sub(s) 
               dblTest += s.Test * MassFractions(s) 
              End Sub) 
     Return dblTest 
    End Get 
End Property 

しかし、いくつかの理由で、これはイベントリスナーとの言及にいくつかの予期しない動作につながります。パラレルなループに変更することで、この問題が解決されました。解決済みの例:

Public ReadOnly Property Test As Double 
    Get 
     Dim dblTest As Double = 0 

     For Each s As Substance In MassFractions.Keys 
      dblTest += s.Test * MassFractions(s) 
     Next 

     Return dblTest 
    End Get 
End Property 
関連する問題