gpt4 book ai didi

c - 加速从 c 中的文本文件读取的可能替代方法?

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:28 26 4
gpt4 key购买 nike

我正在开发一个机器学习应用程序,我的特征存储在巨大的文本文件中。目前我实现数据输入读取的方式,实用起来很慢。基本上,文本文件的每一行都代表一个稀疏格式的特征向量。例如,以下示例以 index:value 方式包含三个特征。

1:0.34 2:0.67 6:0.99 12:2.1 28:2.1
2:0.12 22:0.27 26:9.8 69:1.8
3:0.24 4:67.0 7:1.9 13:8.1 18:1.7 32:3.4

以下是我现在进行阅读的方式。因为我事先不知道特征字符串的长度,所以我只读了一个适当大的长度,它是每个字符串长度的上限。有一次,我从文件中读取了行,我只是使用 strtok_r 函数将字符串拆分为键值对,然后进一步处理它以将其存储为稀疏数组。非常感谢任何有关如何加快速度的想法。

FILE *fp = fopen(feature_file, "r");

int fvec_length = 0;
char line[1000000];
size_t ln;
char *pair, *single, *brkt, *brkb;

SVECTOR **fvecs = (SVECTOR **)malloc(n_fvecs*sizeof(SVECTOR *));
if(!fvecs) die("Memory Error.");

int j = 0;

while( fgets(line,1000000,fp) ) {
ln = strlen(line) - 1;
if (line[ln] == '\n')
line[ln] = '\0';

fvec_length = 0;
for(pair = strtok_r(line, " ", &brkt); pair; pair = strtok_r(NULL, " ", &brkt)){
fvec_length++;
words = (WORD *) realloc(words, fvec_length*sizeof(WORD));
if(!words) die("Memory error.");
j = 0;
for (single = strtok_r(pair, ":", &brkb); single; single = strtok_r(NULL, ":", &brkb)){
if(j == 0){
words[fvec_length-1].wnum = atoi(single);
}
else{
words[fvec_length-1].weight = atof(single);
}
j++;
}
}
fvec_length++;
words = (WORD *) realloc(words, fvec_length*sizeof(WORD));
if(!words) die("Memory error.");
words[fvec_length-1].wnum = 0;
words[fvec_length-1].weight = 0.0;

fvecs[i] = create_svector(words,"",1);
free(words);
words = NULL;
}
fclose(fp);
return fvecs;

最佳答案

  1. 您绝对应该减少内存分配的数量。经典方法是在每次分配时将 vector 加倍,以便获得对数数量的分配调用,而不是线性的。

  2. 由于您的行模式看起来是不变的,因此无需手动对其进行标记化,在每个加载的行上使用单个 sscanf() 直接扫描该行的单词。

  3. 您的行缓冲区似乎非常大,这可能会破坏堆栈,使缓存局部性稍微恶化。

关于c - 加速从 c 中的文本文件读取的可能替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16076952/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com