Hi Martina,
so kann man es machen. Ich habe dir ein Beispiel hineingestellt. Allerdings verzichtet es darauf mit Nebenläufigkeit zu arbeiten was ja die Idee hinter dem mapreduce ist. Aber das Schema lässt sich erkennen.
Das Programm wertet die Anzahl der Wörter einer partiellen Map aus.
Diese wird dann in eine Map[Wort, Anzahl] (mapped_map) umgespeichert.
Die diese partiell errechnete Map wird dann wieder reduziert (reduced_map)
was durch eine einfache Kompression der Key-Value-Paare stattfindet.
Das Programm kann und wird Fehler haben.
Der Output des Programms ist dann:
S : Geht 1
S : Hallo 1
S : Test 9
S : Uhr 1
S : Warum 1
S : Was 1
S : Welt 1
S : Wer 5
S : Weshalb 1
S : Wie 1
S : Wieso 1
S : an 1
S : bleibt 1
S : der 1
S : dumm 1
S : fragt 1
S : gedreht 1
S : hat 1
S : nicht 2
S : noch 1
S : weiss 1
Aber dieses Beispiel kann dir nur helfen das Schema zu erkennen und ggf. bei deinem Problem mit dem algorithmisieren einer solche Anfoderung. Für ein echtes mapreduce müsstest du eine Bibliothek haben oder dir überlegen wie du
virtualmap(…) virtualreduce(…) asynchron machst.
Das geht aber nicht auf die Schnelle.
#include
#include
#include
using namespace std;
void virtualmap(string my_string, map& my_map) {
string s = {};
for (unsigned int i = 0; i ::iterator it = my_map.find(s);
if (it != my_map.end()) {
(*it).second++;
}
else {
my_map.insert(pair(s, 1));
}
s.clear();
}
else {
s.append(my_string.substr(i, 1));
}
}
}
void virtualreduce(map>& my_mapped_map, map& my_reduced_map)
{
map>::iterator mapped_map_it;
// walk through partially mapped maps [2 Wer 1 Wie] [1 Wieso 1 Weshalb 1 Warum]
for (mapped_map_it = my_mapped_map.begin(); mapped_map_it != my_mapped_map.end(); mapped_map_it++) {
map temp_map = (*mapped_map_it).second;
map::iterator temp_map_it;
// walk through mapped maps [2 Wer 1 Wie]
for (temp_map_it = temp_map.begin(); temp_map_it != temp_map.end(); temp_map_it++) {
map::iterator reduced_map_find_it = my_reduced_map.find((*temp_map_it).first);
if (reduced_map_find_it != my_reduced_map.end()) {
(*reduced_map_find_it).second += (*temp_map_it).second;
}
else {
my_reduced_map.insert(pair((*temp_map_it).first, (*temp_map_it).second));
}
}
}
}
int main (int argc, char argv[])
{
map init_map;
int c = 0;
init_map.insert(pair(1, "Wer Wie Wer "));
init_map.insert(pair(2, "Wieso Weshalb Warum Test "));
init_map.insert(pair(3, "Wer nicht fragt "));
init_map.insert(pair(4, "bleibt dumm "));
init_map.insert(pair(5, "Test Test "));
init_map.insert(pair(6, "Test Test "));
init_map.insert(pair(7, "Hallo Welt "));
init_map.insert(pair(8, "Geht noch nicht "));
init_map.insert(pair(9, "Wer hat an der Uhr gedreht "));
init_map.insert(pair(10, "Wer weiss Was "));
init_map.insert(pair(11, "Test Test "));
init_map.insert(pair(12, "Test Test "));
map * reduced_map = new map();
map::iterator it;
for (it = init_map.begin(); it != init_map.end(); it++) {
/ Map /
map * init_map = new map();
/ virtuell(en) Prozess starten */
virtualmap((it).second, * init_map);
/ Reduce */
map> * mapped_map = new map>();
c++;
mapped_map->insert(pair>(c, * init_map));
virtualreduce( * mapped_map, * reduced_map);
}
map::iterator show_it;
for (show_it = reduced_map->begin(); show_it != reduced_map->end(); show_it++) {
cout