Доступ к отдельным файлам из отдельных потоков, это эффективно? - PullRequest
0 голосов
/ 04 января 2019

У меня есть приложение, которое загружает файлы и обрабатывает данные.Предположим, у меня есть 10 ... 20 файлов для обработки.

некоторые требования, чтобы прояснить вопрос:

  • файлы небольшие, может быть несколько МБ макс.
  • там может быть десяток файлов, может быть, сотня
  • одним примером может быть анализ CSV-данных или JSON, загрузка игровых 3d-моделей

Одна из идей заключается в использовании некоторого потокапул и обрабатывать файлы параллельно.Это эффективно?Может ли моя операционная система обрабатывать доступ к файлам из нескольких потоков?

Я нашел этот вопрос: Доступ к одному файлу с несколькими потоками

Но в моем приложении один поток получил бы доступ к своему«собственный» файл, поэтому никаких коллизий не будет.

В моем приложении я использую C ++ / STL, но мне хотелось бы узнать общее мнение о файловых системах в Linux и Windows.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

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

0 голосов
/ 04 января 2019

Вам необходимо провести тестирование. (возможно, в вашем случае стоит использовать несколько потоков; однако в вашем случае загрузка должна быть настолько быстрой, даже последовательной, что ваш средний пользователь выиграл ''Замечание)

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

Кстати, Linux имеет readahead (2) , posix_fadvise (2) , madvise (2) для подсказки подсистеме виртуальной памяти ядра (то есть, чтобы дать подсказки кешу страниц).

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

Помните, что диск (даже SSD) во много тысяч раз медленнее ОЗУ и последовательно выполняет операции ввода-вывода.

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

...