Действительно ли возможно управлять использованием ЦП из JAVA-приложения?

Только с 100 000 документов, если они не гигантские, не обязательно загрузка данных в память вызывает проблемы. Обратите особое внимание:

  • loading & amp; Токенизация документов уже прошла успешно, прежде чем вы даже начнете поиск / поиск по сетке scikit, и дальнейшее умножение использования памяти происходит в альтернативных моделях с обязательным повторением, не в оригинальных документах
  • [ 1113] API-интерфейсы scikit-learn обычно предполагают, что обучающие данные полностью находятся в памяти - поэтому, хотя самые внутренние классы gensim (Doc2Vec) довольны потоковыми данными произвольного размера, сложнее адаптировать их к scikit-learn

Так что вы должны искать в другом месте, и есть другие проблемы с вашим показанным кодом.

У меня часто возникали проблемы с памятью или блокировкой при попытках scikit-learn на параллелизме (как это разрешено с помощью n_jobs -подобных параметров), особенно в ноутбуках Jupyter. Он разветвляется на все процессы ОС, которые, как правило, увеличивают использование памяти. (Каждый подпроцесс получает полную копию памяти родительского процесса, которая может эффективно использоваться - до тех пор, пока подпроцесс не начнет перемещать / изменять вещи.) Иногда происходит сбой одного процесса или межпроцессного взаимодействия, и основной процесс просто остается в ожидании для ответа - который, кажется, особенно смущает ноутбуки Jupyter.

Таким образом, если у вас нет тонны памяти и вам абсолютно не нужен параллелизм научения научению, я бы рекомендовал сначала попытаться заставить работать вещи с n_jobs=1 - и только позже экспериментировать с большим количеством рабочих мест.

Напротив, workers класса Doc2VecD2VTransformer) используют более легкие нити, и вы должны использовать по крайней мере workers=3 и, возможно, 8 (если у вас есть по крайней мере так много ядер, а не workers=1, который вы используете сейчас.

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

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

Так что вам не нужно делать cross_val_score() снова - вы можете прочитать результаты из GridSearchCV.

5
задан Michael Myers 21 January 2009 в 20:09
поделиться

9 ответов

Та задача (читающий файл из диска и отправляющий его через HTTP) не должна использовать существенное количество ЦП, особенно в скоростях передачи, требуемых для потоковой передачи музыки (если Вы не говорите о многоканальном несжатом PCM или чем-то как этот, но даже затем это должно быть I/O-bound и не использовать много ЦП).

Вы, вероятно, делаете чтение/запись очень неэффективным способом. Вы чтение-запись каждый байт отдельно или Вы используете некоторый буфер?

6
ответ дан 13 December 2019 в 19:37
поделиться

Я проверил бы, сколько буферизации Вы используете. Если Вы чтение-запись один байт за один раз Вы используете много ЦП. Однако, если Вы читаете/пишете, блоки говорят, что 4 КБ это не должно использовать много ЦП вообще. Если Ваша сеть является Интернетом, Ваш ЦП не должен составлять намного более чем 10% единственного клиента.

Одно приближение для размера буфера является пропускной способностью * задержка. например, если Вы ожидаете пользователей к потоку на уровне 500 кБайт/с и существует сетевая задержка до 0,1 секунд, затем размер буфера должен составить приблизительно 50 КБ.

2
ответ дан 13 December 2019 в 19:37
поделиться

Можно понизиться, это - приоритетные методы использования в Потоке (через Thread.currentThread () при необходимости).

Можно также вставить задержки, это обрабатывает цикл (Thread.sleep ()).

Кроме этого, позвольте O/S заботиться о нем. Если Ваша программа может использовать 100% ЦП, и ничему иному не нужен ЦП, Ваше приложение могло бы также использовать его вместо того, чтобы позволить O/S бездействовать, задача имеет его.

Это также верно, что потоковой передачей данных должен быть связанный ввод-вывод, таким образом, необходимо определенно рассмотреть то, что делается между чтением данных и отправкой его. Вы читаете/отправляете байт байтом, освободил буфер, например?

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

2
ответ дан 13 December 2019 в 19:37
поделиться

Сделайте у Вас есть один или несколько из:

  • Программное обеспечение RAID
  • Сжатая папка
  • Навязчивая антивирусная проверка
  • Петлевая файловая система
1
ответ дан 13 December 2019 в 19:37
поделиться

В дополнение к информации, данной выше: JVM свободна в том, как она использует потоки ОС. Поток в Вашем JAVA-приложении мог бы работать в отдельном потоке ОС, или это могло бы совместно использовать тот поток с другими Потоками. Проверьте документацию на JVM, которую Вы используете для получения дополнительной информации.

0
ответ дан 13 December 2019 в 19:37
поделиться

Я не думаю, что можно понизить приоритет, не теряя функциональность (потоковая музыка). Ваша программа получает это много CPU от ОС, потому что этому нужен он. Это не похоже на ОС, отдает процессорное время ни по какой причине или потому что "это находится в настроении для него".

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

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

Я повторяюсь, не думайте о сокращении загрузки ЦП путем понижения приоритета процесса или сообщения, что ОС "Не дает так много процессорного времени этому процессу". Это - целая неправильная интуиция в моих глазах. Уменьшите загрузку ЦП путем улучшения алгоритмов и кода после профилирования.

Хорошее начало в профильном Java является этой статьей: http://www.ibm.com/developerworks/edu/os-dw-os-ecl-tptp.html

0
ответ дан 13 December 2019 в 19:37
поделиться

VisualVM очень прост в использовании для обнаружения, где процессорное время проводится для JAVA-приложений, и он включен в последние версии JDK (названный jvisualvm.exe в Windows)

0
ответ дан 13 December 2019 в 19:37
поделиться

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

0
ответ дан 13 December 2019 в 19:37
поделиться

В продолжение моего комментария "хорошо продуманные буферы", хорошее практическое правило для буферизации TCP, размер буфера = 2 * полоса пропускания * задержка

Итак, если вы хотите передавать музыку со скоростью 214 Кбит / с (около 27 КБ / с) и иметь, скажем, 60 мс задержки, вы смотрите на 3,24 килобайта и округляете до хорошего буфера 4 КБ будет очень хорошо работать для вас в широком диапазоне систем.

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

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