Я пишу сервисный клиент, который вызывает огромные строки с разделителями, содержащие отдельные записи из удаленного сервиса.Из-за размера этих строк я делю вызовы удаленной службы на порции (диапазоны дат) и параллельно выполняю циклы по диапазонам дат, чтобы вызывать удаленную службу и анализировать данные.Проблема в том, что 50% + записей являются дубликатами, поэтому я хочу отфильтровать их ...
Вот мой текущий подход:
// We want to filter out duplicate markets by using the MarketId field...
HashSet<ParsedMarketData> exchangeFixtures =
new HashSet<ParsedMarketData>(
new GenericEqualityComparer<ParsedMarketData, int>(pmd => pmd.MarketId));
DateTime[][] splitTimes =
SplitDateRange(startDate, endDate, TimeSpan.FromDays(1));
// Effectively a Tasks.Parallel.ForEach call...
_parallel.ForEach(splitTimes, startEndTime =>
{
DateTime start = startEndTime[0];
DateTime end = startEndTime[1];
string marketDataString = remoteServiceProxy.GetMarketData(start, end);
IEnumerable<ParsedMarketData> rows =
_marketDataParser.ParseMarketData(marketDataString);
foreach (ParsedMarketData marketDataRow in rows)
{
lock (_syncObj)
{
// Ignore the return value as we don't care
// if it gets added or not...
marketDataList.Add(exchangeFixture);
}
}
});
По сути, это заблокированная структура данных (котораянаходит дубликаты) наиболее эффективный подход к этой проблеме или его можно улучшить?
Возможно, стоит знать, что большинство (95% +) «дубликатов» встречаются в каждой временной шкале.Т.е. если мы будем извлекать «день A» и «день B» параллельно, между днем A и днем B не будет много (или вообще ничего) дубликатов (но много в каждом дне - и в моем решении каждый поток).