私は、機能が巨大なテキスト ファイルに格納されている機械学習アプリケーションに取り組んでいます。現在、データ入力読み取りを実装した方法は、実用化するには時間がかかります。基本的に、テキスト ファイルの各行は、スパース形式の特徴ベクトルを表します。たとえば、次の例にはindex:value
ファッションの 3 つの機能が含まれています。
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;