自動生成されたC++ソースファイルがあり、サイズは約40MBです。これは主に、プッシュされるいくつかのベクトルと文字列定数のpush_backコマンドで構成されています。
このファイルをコンパイルしようとすると、g ++が終了し、十分な仮想メモリ(約3 GB)を予約できなかったと表示されます。この問題をグーグルで調べてみると、コマンドラインスイッチを使用すると
--param ggc-min-expand=0 --param ggc-min-heapsize=4096
問題を解決する可能性があります。ただし、これらは最適化がオンになっている場合にのみ機能するようです。
1)これは本当に私が探している解決策ですか?
2)または、これを行うためのより速く、より良い(コンパイルにはこれらのオプションを利用して時間がかかる)方法はありますか?
幸運をお祈りしています、
アレクサンダー
更新:すべての良いアイデアをありがとう。私はそれらのほとんどを試しました。いくつかのpush_back()操作の代わりに配列を使用すると、メモリ使用量が削減されましたが、コンパイルしようとしたファイルが非常に大きいため、後でクラッシュしました。ある意味、このような設定では最適化するものがあまりないため、この動作は非常に興味深いものです。GCCは、メモリを大量に消費する舞台裏で何をしているのでしょうか。(私はすべての最適化も非アクティブ化してコンパイルし、同じ結果を得ました)
ここで切り替えた解決策は、を使用して元のファイルから作成したバイナリオブジェクトファイルから元のデータを読み込むことですobjcopy
。これは私が最初はやりたくなかったことです。なぜなら、C ++でこれを行うよりも、高水準言語(この場合はPerl)でデータ構造を作成する方が便利だったからです。
ただし、これをWin32で実行することは、予想よりも複雑でした。objcopyはELF形式のファイルを生成しているようで、出力形式を手動でに設定すると、問題のいくつかが解消されたようpe-i386
です。オブジェクトファイル内のシンボルは、標準でファイル名にちなんで名付けられています。たとえば、ファイルinbuilt_training_data.bin
を変換すると、binary_inbuilt_training_data_bin_startとbinary_inbuilt_training_data_bin_endの2つのシンボルになります。これらのシンボルをとして宣言する必要があると主張するチュートリアルをWebで見つけましたextern char _binary_inbuilt_training_data_bin_start;
が、これは正しくないようです-extern char binary_inbuilt_training_data_bin_start;
私のためだけに機能しました。