Member 8358871 Ответов: 3

Parallel.forloop с блокировкой замедляет производительность


используя фиксатор луч медленно

Parallel.For(0, newDt3.Rows.Count, row =>
{
    for (int col = 0; col < newDt3.Columns.Count; col++)
    {
        lock (table)
        {
            if (col == 0 || col == 1)
                continue;
            table.AddCell(new Phrase(newDt3.Rows[row][col].ToString(), normalFont));
        }
    }
});


Что я уже пробовал:

Изначально я использую цикл for для большой записи, то я использую параллельно.цикл for, но когда я добавить ячейки в таблице, это дает мне спать после этого я использую замок,но его производительность медленно

F-ES Sitecore

Не похоже, что этот код подходит для параллельной обработки, не весь код подходит. Вам нужно, чтобы цикл срабатывал в определенном порядке, и вы не можете гарантировать это при параллельной обработке.

3 Ответов

Рейтинг:
18

Mehdi Gholam

Очевидно, используя lock это замедлит ход событий.

Parallel.For это хорошо только в том случае, если весь вызываемый код является потокобезопасным, т. е. table.AddCell() которой лань, похоже, не является.

Не оптимизируйте, если у вас нет конкретной проблемы (и в этом случае вы можете достичь на порядки большего с помощью лучших алгоритмов).


Рейтинг:
1

Patrice T

вы можете немного оптимизировать код, но в принципе он не подходит для паралельного выполнения.

Parallel.For(0, newDt3.Rows.Count, row =>
{
    for (int col = 2 0; col < newDt3.Columns.Count; col++)
    {
        lock (table)
        {
            if (col == 0 || col == 1)
                continue;
            table.AddCell(new Phrase(newDt3.Rows[row][col].ToString(), normalFont));
        }
    }
});


Рейтинг:
0

Dave Kreskowiak

Конечно, это так. Вы, по сути, сделали этот код одним потоком, потому что вы блокируете доступ к каждому столбцу каждой отдельной строки. Только одна нить может пройти через замок одновременно.

Существует недостаточно информации, чтобы надежно рассказать вам, как обойти это или как переписать, чтобы избежать блокировки. Мы не знаем что newDt3 и table вы знаете и не знаете, что должна делать ваша операция или ее бизнес-правила.


Member 8358871

таблица-это моя Itextsharp Pdfptable, в которую я добавляю ячейки.Мое требование заключается в экспорте большого объема данных в pdf около 80 000 записей.пожалуйста, предоставьте мне какое-нибудь решение

Dave Kreskowiak

Я не думаю, что у вас есть потоковое решение, доступное вам. Проблема не поддается многопоточному решению. Вы пытаетесь создать пользовательский интерфейс, визуальную таблицу, которая должна быть выполнена в определенном порядке. Проблемы рендеринга пользовательского интерфейса не поддаются резьбе по самой своей природе.

Обычно решение в других фреймворках пользовательского интерфейса состоит в том, чтобы показывать не 80 000 записей, а только одну страницу данных за раз. Но вы не можете этого сделать, так как создаете целый PDF-файл. Нет никакой возможности "пролистать" только видимые данные, так как все они видны одновременно.

Честно говоря, я бы не хотел просматривать сотни страниц PDF-файла, чтобы найти строки, которые я ищу. Просто нет никакого смысла выводить столько данных в Книгу. Даже при 100 записях на страницу вы смотрите на PDF-файл объемом около 800 страниц.

Я бы, вероятно, отложил написание этого PDF-файла для ночной операции, где работает служба, предназначенная для написания этого PDF-файла. Да, это все еще займет некоторое время, но утром он будет доступен для всех, кто в нем нуждается, без необходимости строить его по требованию.