2016-01-25 2 views
1

Моя программа читает текстовые файлы по строкам, выделяя определенные типы слов в каждой строке (важно, в какой строке это слово было найдено). Что было бы лучше, отдельные потоки по файлам (каждый поток будет читать другой файл) или разделять их по строкам (каждый поток будет читать другую строку из того же файла)?C++ #pragma omp parallel: большие задачи или маленькие?

+2

Внедрите и запустите несколько тестов при перестановке количества файлов и их размеров. –

ответ

3

Если у вас нет нескольких жестких дисков, возможно, ни того, ни другого.

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

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

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

Если это вернется к файлу (или нескольким файлам), вы, вероятно, захотите более или менее обратного здесь: один поток для записи вывода на каждый диск результата, а потоки обработки делят свои данные в какой-то очереди. В типичном случае это будет приоритетная очередь, упорядоченная порядком, в котором данные должны быть записаны в выходной файл, поэтому выходной поток всегда записывает данные последовательно.

2

В зависимости от количества файлов и количества строк на каждый файл.

Если у вас относительно мало строк в каждом файле, то параллелизация не будет стоить накладных расходов. То же самое происходит, если вы обрабатываете относительно немного файлов.

Всегда мог бы параллелировать оба.

3

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

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

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

Но опять же, вы должны измерить. Догадываться о производительности идет не так часто. Как @Jerry Coffinpoints out, вполне возможно, что ни одна из них вам не поможет, но, с другой стороны, файлы могут быть предварительно загружены в ОЗУ, и в этом случае его точка может или не может применяться (в полной мере). Действительно, просто попробуй и посмотри. Это широкое поле и трудно предсказать.

Смежные вопросы