1

在我的工作中,我們有各種各樣的大表存儲用於一組多維非參數模型的數據。每個表是一個float陣列,其大小通常爲200,000至5,000,000個元素。限制使用代碼庫大查詢表在Visual Studio 2010

今天,我要對常瑣碎的更新這個代碼庫,更新了一組查找表的,當我發現編譯和項目的鏈接是導致微軟增量鏈接已停止工作,東西我以前沒見過。請注意,我正在更新的表格正在從約290,000個元素的大小增長到每個元素近10,000,000個元素。

我搜查,發現方法的人建議,以解決與增量鏈接彈出的問題,但沒有固定它。我甚至把這個項目整合到了VS 2012中,並且讓它失敗了。

我知道我的項目之前編譯,所以我刪除了更新,並把它恢復到原來的狀態。這個狀態正確地編譯和鏈接,因爲它一直有。然後,我將其中一箇舊表與其中一個新表交換,並且正確編譯和鏈接。但是,一旦我爲更新後的表格進行了另一次交換,它在編譯後與鏈接有同樣的問題。

如前所述,新的表我都添加了具有約10,000,000元每比他們要更新的舊錶顯著較大。鏈接器正努力與這些大型表一起工作是否可行?如果是這樣,爲什麼呢?

新表編譯細跟的代碼庫,它只是連接步驟失敗。如果表的大小是一個問題,是否有任何建議來處理這個問題,仍然可以保持名義建模和查找表的方法?我承認,從尺寸的角度來看,使用參數化模型會更好,因爲它會壓縮數據,但我的團隊不想在這個時候離開他們的傳統方法。

注意每個表的代碼是沿着這些路線的東西:

頭文件

// 
// dataset1.hpp 
// 

#ifndef dataset1_hpp_ 
#define dataset1_hpp_ 

namespace set1 { 
    extern const int tableSize; 
    extern const float table[]; 
} 

#endif 

源文件

// 
// dataset1.cpp 
// 

namespace set1 { 
    extern const int tableSize = 10000000; 
    extern const float table[tableSize] = { 
    /*... Lots of Numbers ... */ 
    }; 
} 
+1

增量鏈接功能不是100%可靠的。如果你得到這個錯誤,那麼首先要做的就是手動刪除..ilk文件,這樣它就從一個新的文件開始。如果錯誤立即重複,那麼你已經達到了內部限制。最有可能的情況下,我會說,你必須禁用它或考慮開始使用文件。 –

+0

@HansPassant是的,你的第一對夫婦的評論是我在網上閱讀和嘗試。然而,即使做你提到的(和其他事情),可悲的是不允許它與整個數據集進行編譯。通過禁用或考慮使用文件是什麼意思? – spektr

+0

你可以將數據移動到文件而不是硬編碼嗎? –

回答

0

在您的.cpp文件中定義的數據爲extern。爲什麼?數據是本地.cpp文件。這對我來說看起來很奇怪。也許你需要:

// 
// dataset1.cpp 
// 

namespace set1 { 
    const int tableSize = 10000000; 
    const float table[tableSize] = { 
     /*... Lots of Numbers ... */ 
    }; 
} 

我不知道這會幫助,但是這是值得一試。也許你會簡單地解決這個問題。

在我過去的工作中,我曾與物體的巨大靜態數組(編譯曾與處理從順序構建函數的大量可能的例外問題)問題,但是比那巨大的靜態數組等工作的罰款。

你爲什麼使用VS2010?嘗試最新版本(免費社區2015)至少只是爲了檢查會發生什麼。

+0

使用'extern'是因爲'table'和'tableSize'用在代碼庫的其他部分,並且在關聯的頭文件中被定義爲'extern'。在我的代碼庫的實際頭文件中,它列出了大量的table和tableSize變量。但是,我們將每個表定義在單獨的.cpp文件中,因爲它們很大。 – spektr

+0

另外,我的工作是在國防部,他們並不傾向於(可悲地)儘可能頻繁地更新他們的工具。例如,我最近纔在運行C++ 11的工作環境中爲我的分類Linux環境獲得了一個編譯器。我想指出,這個問題的沮喪促使我申請VS 2015許可證(這就是我家裏的PC上的環境),所以我們會看到會發生什麼。 – spektr

+0

我想指出,目前,由於我與VS2010卡住,這個問題不會出現像它會解決。我正在研究一種方便的方法來將此問題轉換爲可以使用動態分配的方法,而不依賴於C++ 11功能(如初始化列表)。可悲的是,目前還沒有找到任何方便的方式,但我們會看到。 – spektr