4

Excel 2010、32 ビットの QuantlibXl ライブラリを使用して、大量の過去の財務データを分析しています。私の典型的なワークシートには、最大 100 万行の経験的データの長い列が含まれています。私のマクロは通常、各行を上から下まで実行し、有価証券の再評価などの Quantlib に典型的な財務分析を実行する必要があります。これには、すべての行で Quantlib オブジェクトを作成する必要があります。分析的なものは、数式としてセル内に含まれています。

そのため、最初は一番上の行で数式を含むセルを選択し、右下隅をシートの下部にドラッグしてそれらを埋めようとしました。ここですでに、関連する行数に応じて処理時間が指数関数的に増加しました。

そこで、行の小さなチャンクを一度に処理するマクロを作成する必要があると考えました。マクロは基本的に、一度に 100 行だけ一番上の行を埋めます。それと多くの最適化 (以下で説明) により、確かに速度は大幅に向上しましたが、処理時間は依然として指数関数的に増加しました。

問題は、マクロを最適化しようとしても、実行時間が長くなるほど遅くなるということです。ステータスバーで処理された行を追跡します。たとえば、マクロをキックスタートするときに 1 分あたり 2000 行が処理される場合 (計算はかなり複雑です)、その速度はランタイム全体で絶えず低下します。 60,000 行の 1 分後。そのリズムでは、シートの終わりを見ることはありません。したがって、実際には、ある時点でそれを中止し、停止したところから再開することが最適になります。また、ファイルを分割して、異なるコンピューターで同時に実行できるようにしましたが、これは管理の面で苦労しました。

既に多くの最適化を実装しています: - 画面の更新と自動計算はオフになっています。- 一度に処理される行に対してのみ計算を実行します。- ガベージ コレクション: Quantlib オブジェクトは、使用されなくなった直後に削除されます。スローダウンを引き起こしたのは、空きメモリをすべて消費したためだと思いました。- これまでのところ、関連する結果 (セル) をテキスト ファイルに書き込み、不要になった行を削除しました。繰り返しになりますが、マクロは最初は非常に高速で、70,000 行ほどで再び遅くならなければ、数時間以内に最後まで実行できたでしょう。実際、行が削除されてシートが縮小されるため、実行時に速度が向上することを期待していましたが、実際には起こりませんでした。そのため、60,000 行ごとにプロセスを停止し、再び開始するだけです。

Excel のこの動作が大量のデータを線形に処理せず、再起動を必要とする原因と、それを回避する方法を理解したいと思います。誰かが同様の問題に遭遇し、それを回避する方法を見つけた場合、私はそれについて聞いてうれしいです.

編集: プロセスを停止して最初からやり直すたびに、Excel を再起動する必要があることに気付きました。そうしないと、以前と同じくらい遅く再開します。私の現在の仮説は、ある時点でデータが正しくクリーンアップされていないというものです。この場合、あなたの解決策は私をさらに連れて行ってくれます。Quantlib ライブラリには、ohRepositoryObjectCount() と呼ばれるメモリ内にまだ存在するオブジェクトの数を調べるメソッドがあります。私はすべての計算の後に ohRepositoryDe​​leteAllObjects() 関数を呼び出し、それらは他の方法に従って効果的に削除されていますが、検出されないままの漏れがまだ残っている可能性があります。

EDIT2:長いバッチの後、タスクマネージャが3つまたは4つのExcelプロセスが一緒に約1.5 GBのメモリを消費していることを示しているため、メモリリークがあると確信しています。Excelを終了するとクラッシュし(「Excelはもう機能していません」というメッセージが表示されます)、プロセスが持続するため、手動で強制終了する必要があります。

4

1 に答える 1

0

私の仮定が正しければ、行はすべての証券のリストです。互いに関連していません。そして、あなたはそれらの間で計算しません。それが正しい場合は、次の手順を実行します。

  1. 別のシートで、すべてのデータ列 (入力と出力の両方) をレイアウトして、1 つの行を表します。
  2. 「ソース」シートからデータの 1 行の値をコピーして貼り付けます。
  3. ソース シートからすべての計算を削除し、ここに配置します。
  4. 値をコピーして元のシートに貼り付けます。

#2 から #4 をマクロに入れ、データをループします。

それが私の答えです。以下は単なる解説です。私がそれをしていたら:

  1. 私の「ソース」データはデータベースになります。私が調査したい証券の間には関係があると確信しています。
  2. 読みやすいように、行要素を計算シートの列に転置します。
  3. 読みやすくするために、計算を複数の列とセクションに分割します。
于 2012-10-27T16:22:04.987 に答える