Распараллеливание: Что заставляет потоки Java блокироваться кроме синхронизации и ввода-вывода?

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

@echo off
for /f "tokens=1,*" %%i in (list.txt) do (
   if exist "%%i.txt" %%j copy /Y "%%i.txt" "%%j.txt"

)

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

@echo off
for /f "tokens=1,*" %%i in (list.txt) do (
   if exist "%%i.txt" if not exist "%%j.txt copy "%%i.txt" "%%j.txt"
   if exist "%%j.txt" type "%%i.txt">>"%%j.txt"
)
7
задан Joe 4 December 2008 в 19:59
поделиться

7 ответов

Также важный момент: Какие Аппаратные средства Вы используете? Например, 4-8 Ядер могли означать, что Вы работаете над одним из Солнц центральные процессоры Ниагары. И несмотря на наличие 4-8 Ядер у них есть меньше FPUs. При вычислениях научного материала это могло произойти, что FPU является узким местом.

1
ответ дан 6 December 2019 в 21:21
поделиться

Вы пытаетесь использовать полную возможность ЦП для своих вычислений, но сама ОС использует ресурсы также. Так знайте, что ОС заблокирует часть Вашей казни для удовлетворения ее потребностей.

0
ответ дан 6 December 2019 в 21:21
поделиться

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

Это звучит очень нечетным, если Вы ничего действительно не совместно используете. Можно ли дать нам больше идеи того, что действительно делает код?

Что происходит, если Вы выполняете n копии программы, поскольку другой Java обрабатывает с каждым единственным использованием единственного потока? Если это использует каждый ЦП полностью, то, по крайней мере, мы знаем, что это не может быть проблема с ОС. Разговор об ОС, на каком это работает, и который JVM? Если можно попробовать другой JVMs и различные Ose, результаты могли бы дать Вам подсказку относительно что случилось.

2
ответ дан 6 December 2019 в 21:21
поделиться

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

При работе Windows все графические операции работают на единственном потоке несмотря ни на что. Другие операционные системы имеют подобные ограничения.

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

Если Вы не представляете много gui, наиболее вероятный преступник - то, что Вы спорите больше, чем Вы думаете для некоторого совместно используемого ресурса. Это легко замечено с инструментами профилировщика как jprofiler. Некоторый VM's как jrockit BEA может даже сказать Вам это прямо из поля.

Это - одно из тех мест, где Вы не хотите действовать на догадки. Получите профилировщика!

5
ответ дан 6 December 2019 в 21:21
поделиться

В первую очередь, GC не произойдет только "в ситуации с давлением памяти", но в любое время JVM считает целесообразным (непредсказуемый, насколько я знаю).

Во-вторых, если Ваши потоки выделяют память в "куче" (Вы упоминаете, что они используют Наборы, таким образом, я предполагаю, что они действительно присваивают память в "куче"), Вы никогда не можете быть уверены, ли эта память в настоящее время находится в RAM, или на странице Virtual Memory (ОС решает), и таким образом доступ к "памяти" может генерировать блокирующий доступ ввода-вывода!

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

Я полагаю, что будет трудно получить дальнейшие подсказки на Вашей проблеме, если Вы не обеспечите более конкретный (код) информация.

4
ответ дан 6 December 2019 в 21:21
поделиться

Вы делаете синхронизацию на некотором уровне.

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

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

0
ответ дан 6 December 2019 в 21:21
поделиться

Попробуйте задержку анализатор, который идет с Управлением полетом JRockit. Это покажет Вам, что делает ЦП, когда это ничего не делает, если приложение ожидает файлового ввода-вывода, TLA-выборок, объектных выделений, приостановки потока, блокировок JVM, паузы gc и т.д. Можно также видеть переходы, например, когда один поток будит другого. Издержки незначительны, 1% или около этого.

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

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: