Балансировка нагрузки по модулю без мьютекса? - PullRequest
0 голосов
/ 04 мая 2011

Возможно, я все делаю неправильно, но вот моя проблема и предлагаемое решение:

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

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

Есть ли способ сделать этот стиль производителя / потребителя без замков?

Ответы [ 3 ]

1 голос
/ 04 мая 2011

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

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

Один из способов гарантировать, что записи не будут перезаписаны, заключается в наличии рабочегоПотоки отправляют сообщение, чтобы обновить поток ввода-вывода с тем, сколько записей было обработано, очень часто.Этот подход не требует блокировки;только элементарная операция для обновления потока ввода-вывода время от времени.

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

0 голосов
/ 04 мая 2011

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

Относительно ввода / вывода: вы действительно можете разделить файл? Если у вас есть дешевый способ определения конца записи, может быть просто разделить файл и поместить различные части на разные машины. Или просто купите более быстрый HDD.

0 голосов
/ 04 мая 2011

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

...