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