Когда выполняется параллельный поиск, когда пропускная способность памяти станет ограничивающим фактором? - PullRequest
1 голос
/ 29 июля 2009

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

Я пытался заставить это работать параллельно и у меня есть несколько вопросов.

  1. Как мне это сделать? Я не могу скопировать весь файл в память, так как он слишком большой. Будут ли работать несколько указателей FILE *?

  2. Сколько потоков я могу поместить в файл, прежде чем пропускная способность диска станет ограничивающим фактором, а не процессором? Как я могу обойти это?

В настоящее время я думал о том, что я буду использовать 4 потока, каждый из которых будет иметь файл FILE * с 0%, 25%, 50% и 75% проходом по файлу, и каждый из них сохранит свои результаты в файл. или память, а затем собрать результаты в качестве последнего шага. Хотя при таком подходе, в зависимости от пропускной способности, я мог бы легко добавить больше потоков и, возможно, получить большее ускорение.

Что вы думаете?

РЕДАКТИРОВАТЬ: Когда я сказал пропускную способность памяти, я на самом деле имел в виду дисковый ввод-вывод. Извините за это.

Ответы [ 3 ]

6 голосов
/ 29 июля 2009

С этой новой пересмотренной версией вопроса, ответ «почти сразу». Жесткие диски не очень хороши для чтения из двух мест на диске одновременно. :) Если бы у вас было несколько жестких дисков и разбили на них файл, вы, вероятно, могли бы воспользоваться некоторыми потоками. Честно говоря, я бы сказал, что скорость диска составляет уже ограничивающий фактор. Я очень сомневаюсь, что ваш диск может читать данные быстрее, чем процессор может с этим справиться.

1 голос
/ 29 июля 2009

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

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

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

Несколько указателей FILE * будут работать - но на самом деле они могут работать медленнее, чем просто один, так как в конечном итоге они будут разбивать время на чтение файла, и вы будете больше прыгать на диске.

0 голосов
/ 30 июля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...