我有一個自動生成的C++源文件,大小約爲40 MB。它主要由push_back命令組成,用於某些向量和字符串常量,這些命令將被推送。gcc/g ++:編譯大文件時出錯
當我嘗試編譯這個文件時,g ++退出並且說它無法保留足夠的虛擬內存(大約3 GB)。谷歌搜索這個問題,我發現,使用命令行開關
--param ggc-min-expand=0 --param ggc-min-heapsize=4096
可以解決該問題。然而,他們似乎只在打開優化時才起作用。
1)這真的是我正在尋找的解決方案嗎?
2)還是有一個更快,更好(編譯需要年齡與這些選項激活)的方式來做到這一點?
最良好的祝願,
亞歷山大
更新:感謝所有的好點子。我嘗試了其中的大部分。使用數組而不是幾次push_back()操作減少了內存使用量,但是由於我試圖編譯的文件非常大,所以只會在稍後崩潰。從某種意義上說,這種行爲非常有趣,因爲在這樣的環境中沒有太多需要優化的地方 - 海灣合作委員會在幕後花費了多少內存? (我也停用所有優化進行編譯並得到相同的結果)
我現在切換到的解決方案是從原始文件中使用objcopy
創建的二進制對象文件讀取原始數據。這是我原本不想做的事情,因爲用更高級別的語言(在這種情況下爲Perl)創建數據結構比在C++中執行此操作更方便。
但是,在Win32下運行它比預期的更復雜。 objcopy似乎以ELF格式生成文件,而且當我手動將輸出格式設置爲pe-i386
時,似乎我已經消失的一些問題消失了。目標文件中的符號是按照文件名後面的標準命名的,例如,轉換文件inbuilt_training_data.bin
將導致這兩個符號:binary_inbuilt_training_data_bin_start和binary_inbuilt_training_data_bin_end。我在網上發現了一些教程,聲稱這些符號應該被宣佈爲extern char _binary_inbuilt_training_data_bin_start;
,但這看起來並不正確 - 只有extern char binary_inbuilt_training_data_bin_start;
爲我工作。
這屬於thedailywtf.com。 – 2009-11-29 23:57:16
我們應該讓他發佈代碼嗎? :-) – paxdiablo 2009-11-30 00:05:10
我知道Markdown JavaScript開始對我的CPU徵稅,因爲我在幾KB後打字;我想像40 MB會給我一個旋轉的死亡彩虹。 – 2009-11-30 00:30:28