У меня проблемы со списком, который передается в широковещательный блок. Вот то, что я до сих пор (псевдо-код, как полный код база слишком долго):Параллельная структура (TDF), представляет собой глубокую копию коллекции, необходимой здесь?
private BroadcastBlock<List<Quote>> tempBCB;
private TransformBlock<List<Quote>, Dictionary<int, IParentOrder>> tfb1;
private TransformBlock<List<Quote>, Dictionary<int, IParentOrder>> tfb2;
private BatchBlock<Dictionary<int, IParentOrder>> batchBlock;
private JoinBlock<List<Quote>, Dictionary<int, IParentOrder>[]> joinBlock;
private TransformBlock<Tuple<List<Quote>,
Dictionary<int, IParentOrder>[]>,List<MySignal>> transformBlock;
tempBCB = new BroadcastBlock<List<Quote>>(quoteList => {
return quoteList;
//return Cloning.CloneListCloneValues<Quote>(quoteList);
});
tfb1 = new TransformBlock<List<Quote>, Dictionary<int, IParentOrder>>(
quotes => {//do something and return Dictionary<int, IParentOrder>});
tfb2 = new TransformBlock<List<Quote>, Dictionary<int, IParentOrder>>(
quotes => {//do something and return Dictionary<int, IParentOrder>});
batchBlock = new BatchBlock<Dictionary<int, IParentOrder>>(2);
joinBlock = new JoinBlock<List<Quote>, Dictionary<int, IParentOrder>[]>(
new GroupingDataflowBlockOptions { Greedy = false });
transformBlock = new TransformBlock<Tuple<List<Quote>,
Dictionary<int, IParentOrder>[]>, List<MySignal>>(
tuple => { //do something and return List<MySignal>;});
//Linking
tempBCB.LinkTo(tfb1);
tempBCB.LinkTo(tfb2);
tfb1.LinkTo(batchBlock);
tfb2.LinkTo(batchBlock);
tempBCB.LinkTo(joinBlock.Target1);
batchBlock.LinkTo(joinBlock.Target2);
joinBlock.LinkTo(transformBlock);
Моя проблема заключается в том, что с текущей реализацией tempBCB
я получаю странные результаты в конечном TransformBlock<TInput, TOutput>
.
Например, Dictionary<int, IParentrOrder>
коллекции как часть кортежа не имеют одинакового размера даже реализаций tfb1
и tfb2
на 100% идентичны.
Записанная строка в реализации tempBCB
делает глубокую копию широковещательного списка, и это, похоже, решает проблему, но проблема в том, что эта глубокая копия делает мой код примерно в 10 раз медленнее, что на такой величине что мне нужно найти другое решение.
Прежде всего, я не совсем уверен, что это проблема или что это именно так замедляется, что приводит к тому, что параллельные операции выполняются так, как ожидалось, хотя ошибка все еще скрывается там.
Во-вторых, если отсутствие глубокой копии в блоке вещания вызывает эти проблемы, как я могу сделать это быстрее?
Вот мой глубоко скопировать код:
public static List<TValue> CloneListCloneValues<TValue>(List<TValue> original)
where TValue : ICloneable
{
List<TValue> ret = new List<TValue>(original.Count);
foreach (TValue entry in original)
{
ret.Add((TValue)entry.Clone());
}
return ret;
}
Я мог бы потенциально кормить Quote[]
вместо List<Quote>
в вещательном блок, но я не вижу, как это помогло бы ускорить производительность глубокой копии.
Мои вопросы:
- ли глубокая копия выдать реальный вопрос здесь (я сомневаюсь, потому что
List<Quote>
, повалили в широковещательный блок никогда не изменяется какой-либо из блоков преобразования)? - Если да, то почему и как сделать глубокую копию более эффективной?
Можете ли вы создать самодостаточный, полный пример кода, демонстрирующий поведение? Я хочу сказать, что проблема - это копия, и вы не можете обойти ее (но это зависит от поведения, которое проявит ваш пример), но я не могу дублировать поведение с тем, что я читаю выше. – casperOne
Кроме того, почему бы вам не ожидать, что 'tfb1' и' tfb2' не будут возвращать разные результаты? Если у вас есть отдельные блоки преобразования, я бы ожидал, что они будут делать разные вещи. – casperOne
@casperOne вскоре опубликует самодостаточный код. Я ожидаю тех же результатов, потому что блоки генерируют одни и те же данные, но у меня будут инициализированы блоки с тем же Func, чтобы сделать его более ясным. –