C将数组或变量保留在内存中,并在下次执行程序时访问它

val*_*nko 2 c arrays optimization

我正在将mysql中的值加载到数组中,大约需要20分钟. dictionarytable得到3列word1(INT),word2(INT),距离(double)word1和word1得到的值从0到57999,跳过了word2的一些值,因为只有1.8亿行(不是58000*58000)

int i;
double **word;
word=(double **) calloc(58000, sizeof(double *));
for(i=0;i<58000;i++)
    word[i]=(double *) calloc(58000, sizeof(double));

for(word1=0;word1<58000;word1++) {
        char query[600];
        sprintf(query, "SELECT word1, word2, distance from dictionary where word1='%d'", word1);
        mysql_query(con, query);
        result = mysql_store_result(con);
        while (row = mysql_fetch_row(result)) {
            double distance;
            word2 = atoi(row[1]);
            sscanf(row[2], "%lf", &distance);
            word[word1][word2] = distance; 
        }
        mysql_free_result(result);
}
Run Code Online (Sandbox Code Playgroud)

该阵列需要14 GB的内存和7 GB的虚拟内存.现在我可以使用这个数组进行进一步的计算.

for(word1=0;word1<58000;word1++) {
    double result[58000];
    for(word2=0;word2<58000;word2++) {
        if(word1 != word2)
        for(i=0;i<58000;i++) {
            result[word1] += pow((word[word1][i] - word[word2][i]), 2);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

许多数组值都是0但我需要数组键来识别我要比较的单词.如何改进此算法?或者如何将此数组加载到内存中并在下次执行程序时重用它?

unw*_*ind 5

一般来说,你不能.现代操作系统不能以这种方式工作.

典型的解决方案是将其拆分为两个程序,并使一个持久性程序通过例如共享内存或其他东西来暴露数据.

如果做不到这一点,你当然可以以一些适当的原始格式使用本地磁盘文件,如果你明智地编写加载代码,它将加载你的I/O系统带宽的一小部分.或者记忆映射文件.

此外,正如评论中指出的那样,请确保您的问题空间大小不会翻两番.