使用Visual Studio 2010中的大型查找表进行代码库链接器的限制

时间:2016-11-30 23:25:14

标签: c++ visual-studio-2010 visual-studio-2012 linker data-analysis

在我的工作中,我们有各种大型表格,用于存储用于一组多维非参数模型的数据。每个表都是float数组,大小通常为200,000到5,000,000个元素。

今天,当我发现项目的编译和链接导致 Microsoft增量链接器已停止工作时,我正在对此代码库进行通常的简单更新,更新一组查找表。强>,我以前没见过的东西。请注意,我正在更新的表格从大约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 个答案:

答案 0 :(得分:0)

在.cpp文件中,您将数据定义为extern。为什么?该数据是此.cpp文件的本地数据。这看起来很奇怪。也许你需要:

//
// dataset1.cpp
//

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

我不确定这会有所帮助,但这是值得尝试的。也许你只是简单地解决这个问题。

在我以前的工作中,我遇到了大量静态对象数组的问题(编译器在处理来自大量顺序ctors的可能异常时遇到了问题),但除了那些巨大的静态数组工作正常。

你为什么使用VS2010?尝试最新版本(免费社区2015)至少只是为了检查会发生什么。