在我的工作中,我们有各种大型表来存储用于一组多维非参数模型的数据。每个表都是一个 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 ... */
};
}
最佳答案
在您的 .cpp 文件中,您将数据定义为 extern。为什么?数据是此 .cpp 文件的本地数据。这对我来说很奇怪。也许你需要:
//
// dataset1.cpp
//
namespace set1 {
const int tableSize = 10000000;
const float table[tableSize] = {
/*... Lots of Numbers ... */
};
}
我不确定这是否有帮助,但值得一试。也许您会简单地绕过这个问题。
在我过去的工作中,我遇到了巨大的对象静态数组问题(编译器在处理来自大量顺序 ctors 的可能异常时遇到了问题),但除此之外,巨大的静态数组工作正常。
您为什么使用 VS2010?至少尝试最新版本(免费 Community 2015)以检查会发生什么。
关于c++ - 在 Visual Studio 2010 中使用大型查找表的代码库链接器的局限性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900092/