val*_*nko 2 c arrays optimization
我正在将mysql中的值加载到数组中,大约需要20分钟.
dictionary
table得到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但我需要数组键来识别我要比较的单词.如何改进此算法?或者如何将此数组加载到内存中并在下次执行程序时重用它?
一般来说,你不能.现代操作系统不能以这种方式工作.
典型的解决方案是将其拆分为两个程序,并使一个持久性程序通过例如共享内存或其他东西来暴露数据.
如果做不到这一点,你当然可以以一些适当的原始格式使用本地磁盘文件,如果你明智地编写加载代码,它将加载你的I/O系统带宽的一小部分.或者记忆映射文件.
此外,正如评论中指出的那样,请确保您的问题空间大小不会翻两番.
归档时间: |
|
查看次数: |
59 次 |
最近记录: |