Der folgende Ansatz verwendet @parallel
eine Verringerung um das gleiche Ergebnis zu erzielen:
list = [[rand(1:3),4,5] for i=1:10000000]; # define random test `list`
@everywhere rdc(d::Vector,i::Vector) = rdc(rdc(Dict(),d),i)
@everywhere rdc(d::Dict,i::Vector) = begin d[i[1]] = 1000; d end
@everywhere rdc(d::Dict,i::Dict) = merge!(d,i)
heavy = @parallel (rdc) for item in list
item
end
heavy
wird nun halten:
Dict{Any,Any} with 3 entries:
2 => 1000
3 => 1000
1 => 1000
Die Idee ist, ein anderes Wörterbuch für jeden Arbeitnehmer zu erzeugen, sie bevölkern und schließe die Wörterbücher schließlich zu einem zusammen. Ich hoffe, dass die Kombination von Wörterbüchern schnell genug ist, um dies sinnvoll zu machen - was vernünftig erscheint.
Um die Idee zu implementieren, definieren wir rdc
und verwenden mehrere Versand, um es für drei Zwecke zu dienen: 1) Initialisieren Sie ein neues Dict auf jedem Arbeiter. 2) Verschiebe einen neuen Gegenstand in einen existierenden Dict eines Arbeiters. 3) Kombiniere die Dicts von verschiedenen Arbeitern in der Endstufe @parallel
. Die drei Methoden von rdc
im obigen Code (in ihrer jeweiligen Reihenfolge) implementieren dies.
Die Notwendigkeit für SharedDict oder SharedArray wird vermieden, da die Mitarbeiter an verschiedenen Objekten arbeiten und die endgültige Kommunikation zwischen den Mitarbeitern in der Implementierung @parallel
ausgeblendet wird.
Was meinst du, es hat nicht funktioniert? Mit einer Liste von Listen mit 1, 2 und 3 in den ersten Slots, bekam ich ein Wörterbuch Mapping 1, 2 und 3 bis 10000000. –
Ich bekomme ein leeres Dict. Heavy: Dict {Any, Any}() –
Sie haben recht, ich habe Julia ohne irgendwelche Worker-Prozesse ausgeführt. Ich sehe jetzt dasselbe. –