Sveicināti,
Šoreiz īsi par Microsoft .NET Framework 4.0 paralēlisma iespēju strādājot ar LINQ izteiksmēm. Par pamatu paņēmu savu rakstu (Izstrādātāja ikdienas, klasiskā uzdevuma atrisinājums ar LINQ iespējām).
Tātad, vispirms īri par uzdevumu. Man ir teksta fails ar datiem, kurus var pārveidot struktūrā.
Izveidoju metodi, kas veiks teksta rindas apstrādi un pārveido to vārdnīcā ar atslēgu. Par atslēgu kalpo LineTags pārskaitījums(Enum).
public static Dictionary<LineTags, string> ParseLine(this string line)
{
return line.Split('\t').Select(
(s, index) => new { Tag = (LineTags)index, Substring = s }).ToDictionary(
c => c.Tag, c => c.Substring);
}
Šādi izskatās kods, kas izsauc datu apstrādi
var lines = new[] { "Andrejs M.\t1\tmale", "Peteris L.\t2\tmale", "Ivars A.\t3\tmale"};
var result = (from l in lines select l.ParseLine());
foreach (var s in result.Select(i => i[LineTags.FullName]))
{
Debug.WriteLine(s);
}
Koda izpildes rezultāts tiek izvadīts Visual Studio atkļūdošanas ekrānā. Piemērs:
Andrejs M.
Peteris L.
Ivars A.
Datu apstrāde šinī gadījumā tiek veikta secīgi, viena pavediena ietvaros (To var redzēt pēc izvades rezultāta). Gadījumā, ja man datorā ir 4 kodolu procesors, tiek izmantots tikai viens kodols. Tātad, uz lieliem datu apjomiem netiek optimāli izmantota vasa pieejamā veiktspēja. Svarīgi ir nodrošināt iespēju veikt darbības paralēli(Paralēlisms), kopējo datu apjomu apstrādāt vairākos pavedienos(izmantojot visus sistēmā pieejamos kodolus).
Paralēlisma programmēšana līdz nesenam laikam bija apgrūtinoša! Skatoties uz kopējo izstrādātāju skaitu, tikai nedaudzie pārzina šo te apgabalu. Puiši no Microsoft balstoties uz uzkrātās pieredzes pacentās maksimāli paslēpt visus šos specifiskos momentus, vienkāršojot paralēlisma izmantošanu.
Atgriežoties pie piemēra. Lai sāktu pielietots visu paralēlisma spēku ir jāizmaina tikai viena koda rindiņa!
var result = (from l in lines.AsParallel() select l.ParseLine());
Ivars A.
Andrejs M.
Peteris L.
Atkļūdošanas ekrānā ieraksti izvadīsies nenoteiktā secībā. Tā ir laba pazīme, kas liecina par paralēlo apstrādi. Arī kodā sastopama metodes AsParallel par to liecina. Kāpēc vispār jāizsauc šī metode? Vienkāršoti sakot, LINQ darbojās ar kolekcijām balstoties uz paplašinošām metodēm, galvenais lai tiek kolekcijas atbalsta IEnumerable interfeisu. Ar metodes AsParallel starpniecību tiek atgriezts objekts ar tipu ParallelQuery<T>. Speciāli šim te jaunajam tipam tiek nodublētas paplašinošās metodes no LINQ. Tādā veidā saglabājot visu līdz šim eksistējošu funkcionalitāte, nav nepieciešamības pārrakstīt vaicājumus.
Cerams noderēs!
Posted
May 05 2009, 10:52 AM
by
andrejs.mamontovs