Я исправил свою проблему. Оказалось, довольно тонко, но благодаря Озаиру - он ударил ногтем по голове. Моя конкретная симуляция не читает очень много данных (только параметры инициализации), но тратит много времени, выплевывая вычисленные данные. Грубый способ, который я реализовал изначально, с использованием стандартного c ++ file.open("tobewritten.dat")
, очень медленный, даже сам по себе, но когда запускается несколько экземпляров, отдельные экземпляры тратят целую вечность, ожидая «времени записи» на жестком диске.
Есть несколько конкретных уроков, которые я выучил:
cout << std::endl
очищает буфер при использовании; если буфер не заполнен, то использование операции записи в ОЗУ будет менее чем оптимальным. Используйте,"\n"
а затем закройте файл в конце. C ++ обрабатывает сброс буфера на диск, когда он заполнен.При одновременной записи нескольких массивных файлов данных (я имею в виду ГБ) лучше всего указывать буфер вручную. На данный момент я установил буфер в 50 МБ. Использование больших буферов означает, что ваша система проводит больше времени между оперативной памятью и процессором и выполняет только дамп на диск (медленный бит) с интервалом 50 МБ.
Даже не используйте
cout
для записи в файл. Это медленнее, чемsprintf
и его варианты.
Используя методы, которые я описал выше, я перешел с 28% использования ЦП для каждого процесса на 100% использования ЦП. «Застрявшее» СОСТОЯНИЕ больше не появляется.