1

大規模なデータセットで最適化タスクを実行すると、オーバーフロー ランタイム エラー 6 がときどき発生します (通常は 1 時間または 2 時間後)。マクロを停止したところから再起動すると、エラーはなくなります。つまり、エラーが発生した場所からマクロを再度起動します。オーバーフロー エラーは、使用後に適切に破棄されないオブジェクトを作成しすぎたという問題に関連している可能性がありますか?

これは私のコンテナー クラスの (簡略化されたバージョン) で、何千回も (Set ... = Nothing を介して) 破棄され、(Set ... = New を介して) 再構築されます。

'CG_data_point custom collection class
    Public data_points As Collection
Private Sub Class_Initialize()
    Set data_points = New Collection
End Sub

Public Sub AddDataPoint(mydate as date, price as double)
    Dim new_data_point As CG_data_point
    Set new_data_point = New CG_data_point
    new_data_point.EnterData mydate, price
    data_points.Add new_data_point
    Set new_data_point = Nothing 'I assume this one could also be skipped
End Sub

Public Sub RMSE(X as double) as double
...
End Sub

Private Sub Class_Terminate()
    Dim data_point As CG_data_point
    For Each data_point In data_points  'destruct each data point individually
        Set data_point = Nothing
    Next data_point
    Set data_points = Nothing
End Sub

'Main module
dim global_container as CG_data_container

sub do_optimizations()
    Do
          set global_container= new CG_data_container
           .... do something with the data, have in call to global function RMSE_UDF as a cell formula for Solver
          set global_container= nothing
    While (...)
end sub

'worksheet function
function RMSE_UDF(X as double)
     global_container.RMSE(X)
end function

コンテナー変数 global_container は、ワークシート UDF (RMSE_UDF) から呼び出すことができる必要があるため、グローバルである必要があります。私の知る限り、ワークシートの数式は、「=RMSE(MyContainer,...)」のようにオブジェクトを引数として持つことはできません。二乗平均平方根誤差 (RMSE) の最小化は、Excel ソルバーで実行されます。

4

2 に答える 2

1

これが必ずしもエラーの原因だとは思いませんが、とにかく修正する価値があります。

コードの次の 2 つの部分を比較対照してください。

からAddDataPoint

data_points.Add new_data_point
Set new_data_point = Nothing

ここでは、一時変数によって参照されるオブジェクトをnew_data_pointコレクションに追加しています。次に、参照していたオブジェクトへの参照を削除するように設定new_data_pointします。Nothing明らかに、コレクションはまだこのオブジェクトへの参照を持っています

からClass_Terminate

For Each data_point In data_points  'destruct each data point individually
    Set data_point = Nothing
Next data_point

ここでは、各項目をコレクションから順番に という一時変数に読み込みますdata_point。次に、参照していたオブジェクトへの参照を削除するように設定data_pointします。Nothing(そうではないかもしれませんが) 明らかに、コレクションはこのオブジェクトへの参照を保持します。

コレクションからすべてのオブジェクトを削除するには、コレクションが空になるまで、コレクションの最初のオブジェクトを繰り返し削除してみてください。

Do Until (data_points.Count < 1)
    data_points.Remove 1
Loop
于 2011-04-18T22:51:00.287 に答える
0

この場合、割り当てのターゲットの制限を超える割り当てを試みると、オーバーフローが発生します。データセットに、日付の制限を超えるもの、またはおそらく2倍を超えるものが含まれている可能性がありますか?これらは私が渡されるのを見る2つのタイプです。多分どこかにミスマッチがあり、大きなダブルが日付として渡されています。この種のものは、たとえば、コレクションに書き込もうとする前に日付の境界をチェックするサブルーチンを使用してチェックできます。

もう1つの可能性は、コレクション自体のサイズです。これは、コレクションがlongによってインデックス付けされているためです。これはかなり大きな数ですが、2,147,483,647レコードを超える必要があります。

于 2011-04-18T17:41:25.590 に答える