Использует ли он процессор при чтении большого файла - PullRequest
3 голосов
/ 26 января 2010

Предположим, я хочу выполнить следующие операции на моем 2-ядерном компьютере:

  1. Чтение очень большого файла

  2. Compute

Требуется ли для чтения файла одно ядро? Ранее я просто создал 2 потока, один для чтения файла и один для вычисления? Должен ли я создать дополнительный поток для вычислений?

Спасибо.

Редактировать

Спасибо, ребята, да, мы всегда должны учитывать, блокирует ли файловый ввод / вывод вычисления. Теперь давайте просто рассмотрим, что файловый ввод-вывод никогда не будет блокировать вычисления, вы можете думать, что вычисления не зависят от данных файла, мы просто читаем файл для дальнейшей обработки. Теперь у нас есть 2 ядра, которые нам нужно прочитать в файле, и нам нужно выполнять вычисления, это лучшее решение для создания 3 потоков, 1 для чтения файлов и 2 для вычислений, как большинство из вас уже указали: чтение потребляет очень мало ресурсов процессора?

Ответы [ 3 ]

4 голосов
/ 26 января 2010

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

Не читайте огромный файл сразу, если можете

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

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

Чтение последовательное

Требуется ли для операции чтения файла 1 ядро?

Да, я думаю, что большинство низкоуровневых операций чтения выполняются последовательно (потребляют 1 ядро).

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

См. Также Ответ переполнения стека на связанный вопрос).

Чтение и вычисления параллельно

Ранее я просто создавал 2 потока, один для чтения файла и один для вычисления? Должен ли я создать дополнительный поток для вычислений?

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

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

Какое у вас узкое место - вычисления или IO?

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

2 голосов
/ 26 января 2010

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

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

ТАКОЕ предостережение: многопоточность сложна и подвержена ошибкам, и лучше иметь правильный код, чем быстрый код, если вы можете выбрать только один. Но я не защищаю темы, как вы можете найти у других на сайте.

0 голосов
/ 26 января 2010

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

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

...