Я пытаюсь найти способ ускорить объединение огромного количества объектов, содержащихся в списках, самым быстрым способом. Надеясь воспользоваться PLINQ, я попытался это сделать, но это не потокобезопасное решение. Я тестировал VS2010 и VS11Beta в 4.0 и 4.5. Это мое примерное приложение. Если вы измените BlowUp() между 1-500, это, как правило, будет работать. После 500 колес выходят на трассу. Это не удастся в нескольких местах. Кто-нибудь знает самый быстрый способ решить эту проблему? (Многомерный массив + PLINQ?)PLINQ ForAll взломан в .NET 4.0 и 4.5
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PLinqBlowsUp
{
class Program
{
static void Main(string[] args)
{
BlowUp(5000);
}
private static void BlowUp(int blowupNum)
{
try
{
var theExistingMasterListOfAllRowsOfData = new List<List<KeyValuePair<string, dynamic>>>();
//Add some test data
Enumerable.Range(0, blowupNum).AsParallel().ForAll(row => theExistingMasterListOfAllRowsOfData.Add(AddRowToMasterList(row)));
var aNewRowOfData = new List<KeyValuePair<string, dynamic>>();
//Add some test data
var column = new KeyValuePair<string, dynamic>("Title", "MyTitle");
aNewRowOfData.Add(column);
var anotherNewRowOfData = new List<KeyValuePair<string, dynamic>>();
//Add some test data
var columnA = new KeyValuePair<string, dynamic>("Date", DateTime.Now);
var columnB = new KeyValuePair<string, dynamic>("ImportantColumn", "ImportantData");
var columnC = new KeyValuePair<string, dynamic>("VeryImportantColumn", "VeryImportantData");
anotherNewRowOfData.Add(columnA);
anotherNewRowOfData.Add(columnB);
anotherNewRowOfData.Add(columnC);
//Now the Problem
aNewRowOfData.AsParallel().ForAll(anrod => theExistingMasterListOfAllRowsOfData.ForEach(temloarod => temloarod.Add(anrod)));
anotherNewRowOfData.AsParallel().ForAll(anrod => theExistingMasterListOfAllRowsOfData.ForEach(temloarod => temloarod.Add(anrod)));
//Test for number
foreach (var masterRow in theExistingMasterListOfAllRowsOfData)
{
if (masterRow.Count != 7)
throw new Exception("BLOW UP!!!");
}
}
catch (AggregateException ex)
{
Console.WriteLine(ex.Message);
}
}
private static List<KeyValuePair<string, dynamic>> AddRowToMasterList(int row)
{
var columnA = new KeyValuePair<string, dynamic>("FirstName", "John" + row.ToString());
var columnB = new KeyValuePair<string, dynamic>("LastName", "Smith" + row.ToString());
var columnC = new KeyValuePair<string, dynamic>("Ssn", 123456789 + (row*10));
var list = new List<KeyValuePair<string, dynamic>>();
list.Add(columnA);
list.Add(columnB);
list.Add(columnC);
return list;
}
}
}
Принимая приведенные ниже предложения ... в настоящее время пытается использовать ForAll с многомерным массивом KVP, чтобы обеспечить скорость нескольких ядер для этого типа процесса. – YurikoEX
У кого есть такой вопрос? В нем говорится, что «PLA-файл ForAll не работает». Это просто неверно, и он показывает только недоразумение от вопрошающего (что является законным, никто не знает все, но в его текущей форме вопрос плох). Какая вероятность того, что ForAll будет разбита, и никто не догадывался об этом до сих пор? – sloth