2016-12-01 5 views
0

昨日質問がありましたhere extern配列で指定された大きなルックアップテーブルを使用する際の潜在的な問題を理解しようとしました。これらのテーブルはすべて、ノンパラメトリックモデルのセットに使用されます。ノンパラメトリックモデルは、顧客が使用するDLLに組み込む必要があります.DLLは、例えば1000Hz程度で計算を行うことが想定されています。Visual Studio 2010のC++でextern配列に許容される最大配列サイズ

今私のプロジェクトでは、合計66.2Mのフロートの合計ストアのexternアレイルックアップテーブルの組み合わせがあるため、合計で約265MBのデータがあります。これらのすべての表を含むプロジェクトは、コンパイルは正常に完了しますが、リンクを完了できません。しかし、extern配列に格納されているデータが約180MB未満の場合、プロジェクトはコンパイルされてリンクされます。

昨日の私のポストから、私のプロジェクトがエクスターナルアレイに保存できるデータ量の限界にぶつかっているという多くの証拠が集まってきました。 extern配列/変数のセットに格納できるデータの量には実際の制限がありますか? extern配列にあまりにも多くのデータを持つことによって壊れる可能性のあるリンカーにバグがありますか?何らかの制限がある場合、上限を何かよりも高くする方法や、この問題を何らかの形で回避する方法がありますか?

私のプロジェクトはWin32プロジェクトです。

編集

注問題についての詳細情報が表示され、エラーのように、ポストの開始時に私のリンクになっていること。以下は、VS 2010でのポップアップやメッセージのいくつかのスクリーンショットです:この大規模な配列のために

Pop-up of Incremental Linker Failing

Visual Studio Linking Output after Incremental Linker Fails

+1

あなたが受け取ったエラーを投稿してください。 –

+0

@KirillKobelevエラーに関する情報は、最初の文の太字の「here」に埋め込まれたリンクにあります。私はすでに額面でエラーを調査し、それを修正する方法についての多くの解説を見つけて、言及したことを試して、それを修正しなかったことに注意してください。私の実験では、extern配列に格納されているデータの特定のしきい値を超えるとリンカーが失敗することが示されています。 – spektr

+1

私はあなたが何をしているのか、なぜexternがすべての数字を宣言しているのか分からない。私は 'float numbers [10000]'がDLL内の数値を宣言していて、メインプログラムの 'extern float * numbers'を宣言していると考えました。 – pm100

答えて

1

あなたは配列の代わりに、動的メモリを使用する必要があります。あなたの場合、配列はスタックまたはデータセグメントに割り当てられます。実際、約100KBを超えるものは配列として決して割り当てられません。それはあらゆる種類のトラブルを引き起こす可能性があります。プログラムを稼働させても、重大なパフォーマンス上のペナルティが発生する可能性があります。

+1

静的配列は非常に大きくなる可能性があります。私はいくつかの10 mb静的配列を持つアプリケーションを持っています。それは魅力のように働く。 –

+1

もちろん可能です。そして、いくつかのケースでは、彼らが望ましいです。しかし、私はそれが普通だとは思わない。また、10MBは256MBとほとんど同じです。 –

+0

@ YanZhouご意見ありがとうございます。これは明らかに何かを稼働させるための実現可能なルートです。しかし、現在の設定がうまくいかない理由を理解しようとしています.180MB程度のデータを渡すまで何年も働いていると考えています。私は理想的には、特にそれが実行時のパフォーマンス(否定的)と私たちがこのDLLを生成するために使用するプロセスに影響を与える可能性がある場合、コードで何かを変える必要はありません。 – spektr

関連する問題