Таким же образом вы получили 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
Релевантная информация, кажется, немного рассеивается по сравнению с обычной документацией MS. Существует этот отчет, который обсуждает Установление приоритетов ввода-вывода в окнах. Этот документ, кажется, имеет бета флаги на всем протяжении его, но я предполагаю, что это, вероятно, главным образом довольно точно.
Две важных вещи отметить:
Полезными API для клиентских приложений является SetFileInformationByHandle:
FILE_IO_PRIORITY_HINT_INFO priorityHint;
priorityHint.PriorityHint = IoPriorityHintLow;
result = SetFileInformationByHandle( hFile,
FileIoPriorityHintInfo,
&priorityHint,
sizeof(PriorityHint));
// 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);
// reserve bandwidth of 200 bytes/sec
result = SetFileBandwidthReservation( hFile,
1000,
200,
FALSE,
&transferSize,
&outstandingRequests );
Поскольку .NET делает обычный материал с P/Invoke.
Похоже, что "настоящий" способ установить 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-приоритета процесса, доступную здесь.