実装を最適化する方法を探しています。基本的に、これは "reduce" のような (Map Reduce フレームワークからの) 関数です。キーとその値を取ります。目標は、すべての値が異なるかどうかをチェックし、それらをリストの形式で出力することです: value1;value2;value3;...valuen; 文字列として。n は非常に大きくなる可能性があります (1000 単位)
void unique(char *key, int keybytes, char *multivalue, int nvalues,
int *valuebytes, KeyValue *kv, void *ptr) {
char * value = NULL;
char * elem[nvalues];
int i, j, cx;
char adj[3858905] = "";
大きな問題は、入力ごとに char adj[] の長さを指定する必要があり、値の数がどれだけ大きいかを事前に知らないことです。(それには膨大な量のメモリが必要です)
for (i = 0; i < nvalues; i++) {
if (i == 0) {
value = multivalue;
} else {
value = multivalue + valuebytes[i - 1];
multivalue = multivalue + valuebytes[i - 1];
}
elem[i] = value;
}
size_t elem_length = sizeof(elem)/sizeof(char *);
qsort(elem, elem_length, sizeof(char *), cstring_cmp);
cx = sprintf(adj, "%s;", elem[0]);
j = 0;
for (i = 1; i < nvalues; i++) {
bool matching = false;
if (!strcmp(elem[i], elem[j]))
matching = true;
j++;
if (!matching) //{;}
cx += snprintf(adj + cx, 3858905 - cx - 1, "%s;", elem[i]);
}
adj は出力文字列 (値のリスト) です。
kv->add(key, keybytes, adj, strlen(adj) + 1); //this outputs key-value pairs.
}
ただし、C/C++ のみを使用する必要があります。