Как может приоритет ввода-вывода процесса быть увеличенным?

Таким же образом вы получили maxdata и mindata, вы можете получить nth минимумов и максимумов, выполнив:

df.sort_values(['id1','id2','c1']).groupby(['id1','id2']).c1.nth(1)

      id1  id2
1    a1      6
2    b1     23
Name: c1, dtype: int64

Так что в этом случае вы получите второй минимум. для c1

Где df.sort_values(['id1','id2','c1']) будет сортировать значения по id1, id2 и c1 соответственно, что эквивалентно группированию по id1 и id2 и сортировке c1: [ 1114]

   id1 id2   c1   c2
0    1  a1    5    3
1    1  a1    6    2
2    1  a1    9    4
5    1  a1   34   32
3    2  b1    5    2
4    2  b1   23   43
6    3  3a  234  435
13
задан tshepang 4 June 2014 в 21:42
поделиться

2 ответа

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

Две важных вещи отметить:

  1. Можно только уменьшить приоритет запросов IO ниже нормального.
  2. Драйвер может проигнорировать любой такой запрос и рассматривать его как нормальный так или иначе.

Полезными API для клиентских приложений является SetFileInformationByHandle:

FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
                                     FileIoPriorityHintInfo,
                                     &priorityHint,
                                     sizeof(PriorityHint));

SetPriorityClass:

// reduce CPU, page and IO priority for the whole process
result = SetPriorityClass( GetCurrentProcess(),
                           PROCESS_MODE_BACKGROUND_BEGIN);
// do stuff
result = SetPriorityClass( GetCurrentProcess(),
                           PROCESS_MODE_BACKGROUND_END);

SetThreadPriority, который подобен:

// reduce CPU, page and IO priority for the current thread
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);
// do stuff
SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);

SetFileBandwithReservation:

// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
                                  1000,
                                  200,
                                  FALSE,
                                  &transferSize,
                                  &outstandingRequests );

Поскольку .NET делает обычный материал с P/Invoke.

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

Похоже, что "настоящий" способ установить IO приоритет процесса - это использование NtSetInformationProcess с ProcessIoPriority информационным классом. К сожалению, этот API недокументирован, но вы можете увидеть его в действии, подключив отладчик к taskeng.exe и взломав ExeTask::GetYourPrioritiesStraight.

Я полагаю, что PROCESS_INFORMATION_CLASS значение для ProcessIoPriority равно 33 (0x21), а значения приоритетов следующие:

Very Low: 0
Low: 1
Normal: 2
High: 3 or above?

Вышеуказанные значения являются наилучшим предположением, основанным на том, что я могу сказать из отладчика; планировщик задач, похоже, использует значение 1 для задач с приоритетом 7, и значение 2 для задач с приоритетом 5 (см. этот вопрос и эту статью MSDN для получения дополнительной информации о приоритетах планировщика задач). Вызов SetPriorityClass с PROCESS_MODE_BACKGROUND_BEGIN использует значение 0.

К сожалению, я не нашел никакого публичного API, который можно использовать для этого, кроме метода SetPriorityClass в ответе @1800 INFORMATION, который устанавливает приоритет на Very Low.

Edit: Я написал утилиту, которую можно использовать для запроса или установки IO-приоритета процесса, доступную здесь.

14
ответ дан 1 December 2019 в 18:06
поделиться
Другие вопросы по тегам:

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