浮動小数点数 (> 200,000 の数値) の大きな配列を処理し、これらの配列を使用していくつかの計算を実行する必要があります。
スタックオーバーフローの問題が発生しないように、これらの配列をどのように処理することをお勧めしますか?
更新: 単純および複雑な数学 (合計、積、sin、cos、arctan) 演算を実行したい。
浮動小数点数 (> 200,000 の数値) の大きな配列を処理し、これらの配列を使用していくつかの計算を実行する必要があります。
スタックオーバーフローの問題が発生しないように、これらの配列をどのように処理することをお勧めしますか?
更新: 単純および複雑な数学 (合計、積、sin、cos、arctan) 演算を実行したい。
順次操作する必要がある単純な数値データですか?
std::valarray<double>
プロファイリングでこれが遅くなっていることを示している場合は、次の方法で高速化する方法を探してください。
std::valarray<double>::resize()
(はい、reserve()
残念ながらありません。
なぜstd::valarray<double>
数値データなのですか?すべての要素に対して操作を実行する場合は、呼び出すだけです
std::valarray<double>::apply(somefunction)
詳細については、C++ リファレンスを参照してください。
を可能にしたい場合はreserve()
、 が必要std::vector
になります。これも問題ありませんが、使用する可能性のある数学関数のオーバーロードはありません。
std::valarray
編集:これはもちろん、すべての配列をsに収めるのに十分なメモリがあることを前提としています。そうでない場合は、200,000 行を分割して、同時にメモリ内に多くの float しか存在しないようにする必要があります。
データがまばらな場合は、おそらくブーストのsparse_matrix
http://www.boost.org/doc/libs/1_41_0/libs/numeric/ublas/doc/matrix_sparse.htmを使用してデータ構造を表し、メモリ要件を大幅に削減できます。
それ以外の場合は、データをチャンクに分割し、メモリ内の 1 つのチャンクで作業してから、その状態をファイルに保存して繰り返す方法を検討することをお勧めします。
10.000 あたり 10.000 のように扱い、すべてを合計することをお勧めします。実行している操作によって異なります。
それらをどうしたいかによります。
また、クリスがコメントで言ったように、配列にメモリを動的に割り当て (ヒープからメモリを取得するため)、それをローカル変数 (スタックに割り当てられる) として使用しないようにします。