В последний год или около того, и с моим повышенным вниманием к данным ribo-seq я полностью осознал, что означает термин большие данные. Исследования ribo-seq в их необработанном виде могут легко охватить сотни ГБ, что означает, что их обработка как своевременной, так и эффективной требует некоторого обдумывания. В этом посте, и, надеюсь, в следующем, я хочу подробно описать некоторые из методов, которые я придумала (собрал из разных статей в интернете), которые помогают мне получать данные такого масштаба. В частности, я буду подробно описывать методы для Python, хотя некоторые методы можно перенести на другие языки.
Мой первый большой совет по Python о том, как разбить ваши файлы на более мелкие блоки (или куски) таким образом, чтобы вы могли использовать несколько процессоров. Давайте начнем с самого простого способа чтения файла на python.
with open(«input.txt») as f: data = f.readlines() for line in data: process(line)
Эта ошибка, сделанная выше в отношении больших данных, заключается в том, что она считывает все данные в ОЗУ, прежде чем пытаться обрабатывать их построчно. Это, вероятно, самый простой способ вызвать переполнение памяти и возникновение ошибки. Давайте исправим это, читая данные построчно, чтобы в любой момент времени в оперативной памяти сохранялась только одна строка.
Как узнать сколько оперативной памяти поддерживает твой ПК или ноут?
with open(«input.txt») as f: for line in f: process(line)
Это большое улучшение, и именно оно не перегружает ОЗУ при загрузке большого файла. Затем мы должны попытаться немного ускорить это, используя все эти бездействующие ядра.
import multiprocessing as mp pool = mp.Pool(cores) jobs = [] with open(«input.txt») as f: for line in f: jobs.append( pool.apply_async(process,(line)) ) # дождаться окончания всех работ for job in jobs: job.get() pool.close()
При условии, что порядок обработки строк не имеет значения, приведенный выше код генерирует набор (пул) обработчиков, в идеале один для каждого ядра, перед созданием группы задач (заданий), по одной для каждой строки. Я склонен использовать объект Pool, предоставляемый модулем multiprocessing, из-за простоты использования, однако, вы можете порождать и контролировать отдельные обработчики, используя mp.Process, если вы хотите более точное управление. Для простого вычисления числа объект Pool очень хорош.
Хотя вышеперечисленное теперь использует все эти ядра, к сожалению, снова возникают проблемы с памятью. Мы специально используем функцию apply_async, чтобы пул не блокировался во время обработки каждой строки. Однако при этом все данные снова считываются в память; это время сохраняется в виде отдельных строк, связанных с каждым заданием, ожидая обработки в строке. Таким образом, память снова будет переполнена. В идеале метод считывает строку в память только тогда, когда подходит ее очередь на обработку.
import multiprocessing as mp def process_wrapper(lineID): with open(«input.txt») as f: for i, line in enumerate(f): if i != lineID: continue else: process(line) break pool = mp.Pool(cores) jobs = [] with open(«input.txt») as f: for ID, line in enumerate(f): jobs.append( pool.apply_async(process_wrapper,(ID)) ) # дождаться окончания всех работ for job in jobs: job.get() pool.close()
Выше мы изменили функцию, переданную в пул обработчика, чтобы она включала в себя открытие файла, поиск указанной строки, чтение ее в память и последующую обработку. Единственный вход, который теперь сохраняется для каждой порожденной задачи — это номер строки, что предотвращает переполнение памяти. К сожалению, накладные расходы, связанные с необходимостью найти строку путем итеративного чтения файла для каждого задания, являются несостоятельными, поскольку по мере того, как вы углубляетесь в файл, процесс занимает все больше времени. Чтобы избежать этого, мы можем использовать функцию поиска файловых объектов, которая пропускает вас в определенное место в файле. Сочетание с функцией tell, которая возвращает текущее местоположение в файле, дает:
Управление памятью в python
import multiprocessing as mp def process_wrapper(lineByte): with open(«input.txt») as f: f.seek(lineByte) line = f.readline() process(line) pool = mp.Pool(cores) jobs = [] with open(«input.txt») as f: nextLineByte = f.tell() for line in f: jobs.append( pool.apply_async(process_wrapper,(nextLineByte)) ) nextLineByte = f.tell() for job in jobs: job.get() pool.close()
Используя поиск, мы можем перейти непосредственно к правильной части файла, после чего мы читаем строку в память и обрабатываем ее. Мы должны быть осторожны, чтобы правильно обрабатывать первую и последнюю строки, но в противном случае это будет именно то, что мы излагаем, а именно использование всех ядер для обработки данного файла без переполнения памяти.
Я закончу этот пост с небольшим обновлением вышеупомянутого, поскольку есть разумные накладные расходы, связанные с открытием и закрытием файла для каждой отдельной строки. Если мы обрабатываем несколько строк файла за один раз, мы можем сократить эти операции. Самая большая техническая сложность при этом заключается в том, что при переходе к месту в файле вы, скорее всего, не находитесь в начале строки. Для простого файла, как в этом примере, это просто означает, что вам нужно вызвать readline, который читает следующий символ новой строки. Более сложные типы файлов, вероятно, требуют дополнительного кода, чтобы найти подходящее место для начала / конца чанка.
import multiprocessing as mp, os def process_wrapper(chunkStart, chunkSize): with open(«input.txt») as f: f.seek(chunkStart) lines = f.read(chunkSize).splitlines() for line in lines: process(line) def chunkify(fname,size=1024*1024): fileEnd = os.path.getsize(fname) with open(fname,’r’) as f: chunkEnd = f.tell() while True: chunkStart = chunkEnd f.seek(size,1) f.readline() chunkEnd = f.tell() yield chunkStart, chunkEnd — chunkStart if chunkEnd > fileEnd: break pool = mp.Pool(cores) jobs = [] for chunkStart,chunkSize in chunkify(«input.txt»): jobs.append( pool.apply_async(process_wrapper,(chunkStart,chunkSize)) ) for job in jobs: job.get() pool.close()
Во всяком случае, я надеюсь, что некоторые из вышеперечисленных примеров были новыми и возможно, полезными для вас. Если вы знаете лучший способ сделать что-то (на python), мне было бы очень интересно узнать об этом. В следующем посте, который будет опубликован в ближайшем будущем, я расширю этот код, превратив его в родительский класс, из которого создается несколько дочерних элементов для использования с различными типами файлов.
Источник: dev-gang.ru
Как узнать текущее использование процессора и оперативной памяти в Python?
Не так ли, что эти методы плохи, но есть ли уже поддерживаемый многоплатформенный способ сделать то же самое?
lpfavreau 09 нояб. 2008, в 17:54
Поделиться
Вы можете создать свою собственную многоплатформенную библиотеку, используя динамический импорт: «if sys.platform == ‘win32’: импортировать win_sysstatus как sysstatus; еще» .
John Fouhy 10 нояб. 2008, в 00:02
Было бы здорово иметь что-то, что работает и на App Engine.
Attila O. 30 март 2011, в 15:16
Значит ли возраст пакетов? Если кто-то понял их правильно в первый раз, почему они все равно не были бы правы?
Paul Smith 20 дек. 2016, в 15:10
Показать ещё 1 комментарий
Поделиться:
13 ответов
Лучший ответ
Библиотека psutil предоставит вам некоторую системную информацию (использование ЦП/памяти) на различных платформах:
psutil — это модуль, предоставляющий интерфейс для извлечения информации о запущенных процессах и использовании системы (ЦП, память) переносимым способом с использованием Python, реализуя многие функции, предлагаемые такими инструментами, как ps, top и диспетчер задач Windows.
В настоящее время он поддерживает Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD и NetBSD, как 32-разрядные, так и 64-разрядные архитектуры, с версиями Python от 2.6 до 3.5 (пользователи Python 2.4 и 2.5 могут использовать версию 2.1.3).
ОБНОВЛЕНИЕ: Вот несколько примеров использования psutil :
#!/usr/bin/env python import psutil # gives a single float value psutil.cpu_percent() # gives an object with many fields psutil.virtual_memory() # you can convert that object to a dictionary dict(psutil.virtual_memory()._asdict())
Jon Cage 18 март 2010, в 10:43
Поделиться
Работал для меня на OSX: $ pip install psutil ; >>> import psutil; psutil.cpu_percent() и >>> psutil.virtual_memory() которая возвращает хороший объект vmem: vmem(total=8589934592L, available=4073336832L, percent=52.6, used=5022085120L, free=3560255488L, active=2817949696L, inactive=513081344L, wired=1691054080L)
hobs 17 май 2013, в 17:28
Как можно было бы сделать это без библиотеки psutil?
BigBrownBear00 25 янв. 2015, в 10:44
Austin A 17 июль 2015, в 04:31
Mehulkumar 15 окт.
2016, в 05:42
у вас есть опечатка в строке «psutil.virtual_memory ()` »
riverfall 10 дек. 2018, в 13:04
AiRiFiEd 20 фев. 2019, в 03:42
Jon Cage 23 фев. 2019, в 00:29
AiRiFiEd 23 фев. 2019, в 00:58
Показать ещё 6 комментариев
Используйте библиотеку psutil. На Ubuntu 18.04 pip установлен 5.5.0 (последняя версия) по состоянию на 1-30-2019. Старые версии могут вести себя несколько иначе. Вы можете проверить свою версию psutil, выполнив это в Python:
from __future__ import print_function # for Python2 import psutil print(psutil.__version__)
Чтобы получить статистику по памяти и процессору:
from __future__ import print_function import psutil print(psutil.cpu_percent()) print(psutil.virtual_memory()) # physical memory usage print(‘memory % used:’, psutil.virtual_memory()[2])
virtual_memory (кортеж) будет иметь процент памяти, используемой в масштабе всей системы. Это казалось мне завышенным на несколько процентов в Ubuntu 18.04.
Вы также можете получить память, используемую текущим экземпляром Python:
import os import psutil pid = os.getpid() py = psutil.Process(pid) memoryUse = py.memory_info()[0]/2.**30 # memory use in GB. I think print(‘memory use:’, memoryUse)
который дает текущее использование памяти вашего скрипта Python.
На странице pypi для psutil есть еще несколько подробных примеров.
wordsforthewise 16 авг. 2016, в 22:02
Поделиться
Ниже кодов без внешних библиотек работали для меня. Я тестировал на Python 2.7.9
Использование ЦП
import os CPU_Pct=str(round(float(os.popen(»’grep ‘cpu ‘ /proc/stat | awk ‘ END ‘ »’).readline()),2)) #print results print(«CPU Usage prettyprint-override»>import os mem=str(os.popen(‘free -t -m’).readlines()) «»» Get a whole line of memory output, it will be something like below [‘ total used free shared buffers cachedn’, ‘Mem: 925 591 334 14 30 355n’, ‘-/+ buffers/cache: 205 719n’, ‘Swap: 99 0 99n’, ‘Total: 1025 591 434n’] So, we need total memory, usage and free memory. We should find the index of capital T which is unique at this string «»» T_ind=mem.index(‘T’) «»» Than, we can recreate the string with this information.
After T we have, «Total: » which has 14 characters, so we can start from index of T +14 and last 4 characters are also not necessary. We can create a new sub-string using this information «»» mem_G=mem[T_ind+14:-4] «»» The result will be like 1025 603 422 we need to find first index of the first space, and we can start our substring from from 0 to this index number, this will give us the string of total memory «»» S1_ind=mem_G.index(‘ ‘) mem_T=mem_G[0:S1_ind] «»» Similarly we will create a new sub-string, which will start at the second value.
The resulting string will be like 603 422 Again, we should find the index of first space and than the take the Used Memory and Free memory. «»» mem_G1=mem_G[S1_ind+8:] S2_ind=mem_G1.index(‘ ‘) mem_U=mem_G1[0:S2_ind] mem_F=mem_G1[S2_ind+8:] print ‘Summary = ‘ + mem_G print ‘Total Memory = ‘ + mem_T +’ MB’ print ‘Used Memory = ‘ + mem_U +’ MB’ print ‘Free Memory = ‘ + mem_F +’ MB’
CodeGench 15 фев. 2017, в 12:47
Поделиться
Не думаете ли вы, что с grep и awk лучше позаботиться об обработке строк в Python?
Reinderien 22 окт. 2018, в 12:34
Лично не знакомый с awk, сделал нижеприведенную версию фрагмента использования процессора ниже. Очень удобно, спасибо!
Jay 22 окт. 2018, в 15:51
Нечестно говорить, что этот код не использует внешние библиотеки. На самом деле они сильно зависят от доступности grep, awk и free. Это делает приведенный выше код непереносимым. ОП заявил «Бонусные баллы для * nix и Windows платформ».
Captain Lepton 30 нояб. 2018, в 10:51
Показать ещё 1 комментарий
Один слой для использования ОЗУ с только зависимостью stdlib:
import os tot_m, used_m, free_m = map(int, os.popen(‘free -t -m’).readlines()[-1].split()[1:])
Hrabal 16 фев. 2017, в 13:24
Поделиться
элегантный, простой, эффективный.
Michael Martinez 18 сен.
2018, в 19:33
Здесь кое-что, что я собрал некоторое время назад, это только окна, но может помочь вам получить часть того, что вам нужно.
ПРИМЕЧАНИЕ. Интерфейс/процесс WMI также доступен для выполнения аналогичных задач Я не использую его здесь, потому что текущий метод покрывает мои потребности, но если когда-нибудь ему понадобится расширить или улучшить это, тогда вам может понадобиться изучить инструменты WMI, доступные для доступа.
»’ Monitor window processes derived from: >for sys available mem http://msdn2.microsoft.com/en-us/library/aa455130.aspx > individual process information and python script examples http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true NOTE: the WMI interface/process is also available for performing similar tasks I’m not using it here because the current method covers my needs, but if someday it needed to extend or improve this module, then may want to investigate the WMI tools available. WMI for python: http://tgolden.sc.sabren.com/python/wmi.html »’ __revision__ = 3 import win32com.client from ctypes import * from ctypes.wintypes import * import pythoncom import pywintypes import datetime class MEMORYSTATUS(Structure): _fields_ = [ (‘dwLength’, DWORD), (‘dwMemoryLoad’, DWORD), (‘dwTotalPhys’, DWORD), (‘dwAvailPhys’, DWORD), (‘dwTotalPageFile’, DWORD), (‘dwAvailPageFile’, DWORD), (‘dwTotalVirtual’, DWORD), (‘dwAvailVirtual’, DWORD), ] def winmem(): x = MEMORYSTATUS() # create the structure windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes return x class process_stats: »’process_stats is able to provide counters of (all?) the items available in perfmon. Refer to the self.supported_types keys for the currently supported ‘Performance Objects’ To add logging support for other data you can derive the necessary data from perfmon: ——— perfmon can be run from windows ‘run’ menu by entering ‘perfmon’ and enter. Clicking on the ‘+’ will open the ‘add counters’ menu, From the ‘Add Counters’ dialog, the ‘Performance object’ is the self.support_types key. —> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent) For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary, keyed by the ‘Performance Object’ name as mentioned above. ——— NOTE: The ‘NETFramework_NETCLRMemory’ key does not seem to log dotnet 2.0 properly. Initially the python implementation was derived from: http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true »’ def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]): »’process_names_list == the list of all processes to log (if empty log all) perf_object_list == list of process counters to log filter_list == list of text to filter print_results == boolean, output to stdout »’ pythoncom.CoInitialize() # Needed when run by the same process in a thread self.process_name_list = process_name_list self.perf_object_list = perf_object_list self.filter_list = filter_list self.win32_perf_base = ‘Win32_PerfFormattedData_’ # Define new datatypes here! self.supported_types = < ‘NETFramework_NETCLRMemory’: [ ‘Name’, ‘NumberTotalCommittedBytes’, ‘NumberTotalReservedBytes’, ‘NumberInducedGC’, ‘NumberGen0Collections’, ‘NumberGen1Collections’, ‘NumberGen2Collections’, ‘PromotedMemoryFromGen0’, ‘PromotedMemoryFromGen1’, ‘PercentTimeInGC’, ‘LargeObjectHeapSize’ ], ‘PerfProc_Process’: [ ‘Name’, ‘PrivateBytes’, ‘ElapsedTime’, ‘IDProcess’,# pid ‘Caption’, ‘CreatingProcessID’, ‘Description’, ‘IODataBytesPersec’, ‘IODataOperationsPersec’, ‘IOOtherBytesPersec’, ‘IOOtherOperationsPersec’, ‘IOReadBytesPersec’, ‘IOReadOperationsPersec’, ‘IOWriteBytesPersec’, ‘IOWriteOperationsPersec’ ] >def get_pid_stats(self, pid): this_proc_dict = <> pythoncom.CoInitialize() # Needed when run by the same process in a thread if not self.perf_object_list: perf_object_list = self.supported_types.keys() for counter_type in perf_object_list: strComputer = «.» objWMIService = win32com.client.Dispatch(«WbemScripting.SWbemLocator») objSWbemServices = objWMIService.ConnectServer(strComputer,»rootcimv2″) query_str = »’Select * from %s%s»’ % (self.win32_perf_base,counter_type) colItems = objSWbemServices.ExecQuery(query_str) # «Select * from Win32_PerfFormattedData_PerfProc_Process»)# changed from Win32_Thread if len(colItems) > 0: for objItem in colItems: if hasattr(objItem, ‘IDProcess’) and pid == objItem.IDProcess: for attribute in self.supported_types[counter_type]: eval_str = ‘objItem.%s’ % (attribute) this_proc_dict[attribute] = eval(eval_str) this_proc_dict[‘TimeStamp’] = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S.’) + str(datetime.datetime.now().microsecond)[:3] break return this_proc_dict def get_stats(self): »’ Show process stats for all processes in given list, if none given return all processes If filter list is defined return only the items that match or contained in the list Returns a list of result dictionaries »’ pythoncom.CoInitialize() # Needed when run by the same process in a thread proc_results_list = [] if not self.perf_object_list: perf_object_list = self.supported_types.keys() for counter_type in perf_object_list: strComputer = «.» objWMIService = win32com.client.Dispatch(«WbemScripting.SWbemLocator») objSWbemServices = objWMIService.ConnectServer(strComputer,»rootcimv2″) query_str = »’Select * from %s%s»’ % (self.win32_perf_base,counter_type) colItems = objSWbemServices.ExecQuery(query_str) # «Select * from Win32_PerfFormattedData_PerfProc_Process»)# changed from Win32_Thread try: if len(colItems) > 0: for objItem in colItems: found_flag = False this_proc_dict = <> if not self.process_name_list: found_flag = True else: # Check if process name is in the process name list, allow print if it is for proc_name in self.process_name_list: obj_name = objItem.Name if proc_name.lower() in obj_name.lower(): # will log if contains name found_flag = True break if found_flag: for attribute in self.supported_types[counter_type]: eval_str = ‘objItem.%s’ % (attribute) this_proc_dict[attribute] = eval(eval_str) this_proc_dict[‘TimeStamp’] = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S.’) + str(datetime.datetime.now().microsecond)[:3] proc_results_list.append(this_proc_dict) except pywintypes.com_error, err_msg: # Ignore and continue (proc_mem_logger calls this function once per second) continue return proc_results_list def get_sys_stats(): »’ Returns a dictionary of the system stats»’ pythoncom.CoInitialize() # Needed when run by the same process in a thread x = winmem() sys_dict = < ‘dwAvailPhys’: x.dwAvailPhys, ‘dwAvailVirtual’:x.dwAvailVirtual >return sys_dict if __name__ == ‘__main__’: # This area used for testing only sys_dict = get_sys_stats() stats_processor = process_stats(process_name_list=[‘process2watch’],perf_object_list=[],filter_list=[]) proc_results = stats_processor.get_stats() for result_dict in proc_results: print result_dict import os this_pid = os.getpid() this_proc_results = stats_processor.get_pid_stats(this_pid) print ‘this proc results:’ print this_proc_results
Источник: overcoder.net
Как получить текущее использование ЦП и ОЗУ в Python?
Каков ваш предпочтительный способ получения текущего состояния системы (текущий процессор, оперативная память, свободное место на диске и т.д.) в Python? Бонусные очки для платформ * nix и Windows.
Кажется, есть несколько возможных способов извлечения этого из моего поиска:
- Использование библиотеки, такой как PSI (которая в настоящее время не активно развивается и не поддерживается на нескольких платформах) или что-то вроде pystatgrab (снова нет активности с 2007 года и нет поддержки для Windows).
- Использование специфичного для платформы кода, такого как использование os.popen(«ps») или аналогичного для систем * nix и MEMORYSTATUS в ctypes.windll.kernel32 (см. этот рецепт на ActiveState) для платформы Windows. Можно соединить класс Python со всеми этими фрагментами кода.
Не так ли, что эти методы плохи, но есть ли уже поддерживаемый многоплатформенный способ сделать то же самое?
ОТВЕТЫ
Ответ 1
Библиотека psutil предоставит вам некоторую системную информацию (использование ЦП/памяти) на различных платформах:
psutil — это модуль, предоставляющий интерфейс для извлечения информации о запущенных процессах и использовании системы (ЦП, память) переносимым способом с использованием Python, реализуя многие функции, предлагаемые такими инструментами, как ps, top и диспетчер задач Windows.
В настоящее время он поддерживает Linux, Windows, OSX, Sun Solaris, FreeBSD, OpenBSD и NetBSD, как 32-разрядные, так и 64-разрядные архитектуры, с версиями Python от 2.6 до 3.5 (пользователи Python 2.4 и 2.5 могут использовать версию 2.1.3).
ОБНОВЛЕНИЕ: Вот несколько примеров использования psutil :
#!/usr/bin/env python import psutil # gives a single float value psutil.cpu_percent() # gives an object with many fields psutil.virtual_memory() # you can convert that object to a dictionary dict(psutil.virtual_memory()._asdict())
Ответ 2
Используйте библиотеку psutil. На Ubuntu 18.04 pip установлен 5.5.0 (последняя версия) по состоянию на 1-30-2019. Старые версии могут вести себя несколько иначе. Вы можете проверить свою версию psutil, выполнив это в Python:
from __future__ import print_function # for Python2 import psutil print(psutil.__version__)
Чтобы получить статистику по памяти и процессору:
from __future__ import print_function import psutil print(psutil.cpu_percent()) print(psutil.virtual_memory()) # physical memory usage print(‘memory % used:’, psutil.virtual_memory()[2])
virtual_memory (кортеж) будет иметь процент памяти, используемой в масштабе всей системы. Это казалось мне завышенным на несколько процентов в Ubuntu 18.04.
Вы также можете получить память, используемую текущим экземпляром Python:
import os import psutil pid = os.getpid() py = psutil.Process(pid) memoryUse = py.memory_info()[0]/2.**30 # memory use in GB. I think print(‘memory use:’, memoryUse)
который дает текущее использование памяти вашего скрипта Python.
На странице pypi для psutil есть еще несколько подробных примеров.
Ответ 3
Только для Linux: одна строка для использования ОЗУ только с зависимостью stdlib:
import os tot_m, used_m, free_m = map(int, os.popen(‘free -t -m’).readlines()[-1].split()[1:])
редактировать: указанное решение ОС зависимости
Ответ 4
Ниже кодов без внешних библиотек работали для меня. Я тестировал на Python 2.7.9
Использование ЦП
import os CPU_Pct=str(round(float(os.popen(»’grep ‘cpu ‘ /proc/stat | awk ‘ END ‘ »’).readline()),2)) #print results print(«CPU Usage «» Get a whole line of memory output, it will be something like below [‘ total used free shared buffers cachedn’, ‘Mem: 925 591 334 14 30 355n’, ‘-/+ buffers/cache: 205 719n’, ‘Swap: 99 0 99n’, ‘Total: 1025 591 434n’] So, we need total memory, usage and free memory. We should find the index of capital T which is unique at this string «»» T_ind=mem.index(‘T’) «»» Than, we can recreate the string with this information.
After T we have, «Total: » which has 14 characters, so we can start from index of T +14 and last 4 characters are also not necessary. We can create a new sub-string using this information «»» mem_G=mem[T_ind+14:-4] «»» The result will be like 1025 603 422 we need to find first index of the first space, and we can start our substring from from 0 to this index number, this will give us the string of total memory «»» S1_ind=mem_G.index(‘ ‘) mem_T=mem_G[0:S1_ind] «»» Similarly we will create a new sub-string, which will start at the second value. The resulting string will be like 603 422 Again, we should find the index of first space and than the take the Used Memory and Free memory. «»» mem_G1=mem_G[S1_ind+8:] S2_ind=mem_G1.index(‘ ‘) mem_U=mem_G1[0:S2_ind] mem_F=mem_G1[S2_ind+8:] print ‘Summary = ‘ + mem_G print ‘Total Memory = ‘ + mem_T +’ MB’ print ‘Used Memory = ‘ + mem_U +’ MB’ print ‘Free Memory = ‘ + mem_F +’ MB’
Ответ 5
Здесь кое-что, что я собрал некоторое время назад, это только окна, но может помочь вам получить часть того, что вам нужно.
ПРИМЕЧАНИЕ. Интерфейс/процесс WMI также доступен для выполнения аналогичных задач Я не использую его здесь, потому что текущий метод покрывает мои потребности, но если когда-нибудь ему понадобится расширить или улучшить это, тогда вам может понадобиться изучить инструменты WMI, доступные для доступа.
»’ Monitor window processes derived from: >for sys available mem http://msdn2.microsoft.com/en-us/library/aa455130.aspx > individual process information and python script examples http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true NOTE: the WMI interface/process is also available for performing similar tasks I’m not using it here because the current method covers my needs, but if someday it needed to extend or improve this module, then may want to investigate the WMI tools available. WMI for python: http://tgolden.sc.sabren.com/python/wmi.html »’ __revision__ = 3 import win32com.client from ctypes import * from ctypes.wintypes import * import pythoncom import pywintypes import datetime class MEMORYSTATUS(Structure): _fields_ = [ (‘dwLength’, DWORD), (‘dwMemoryLoad’, DWORD), (‘dwTotalPhys’, DWORD), (‘dwAvailPhys’, DWORD), (‘dwTotalPageFile’, DWORD), (‘dwAvailPageFile’, DWORD), (‘dwTotalVirtual’, DWORD), (‘dwAvailVirtual’, DWORD), ] def winmem(): x = MEMORYSTATUS() # create the structure windll.kernel32.GlobalMemoryStatus(byref(x)) # from cytypes.wintypes return x class process_stats: »’process_stats is able to provide counters of (all?) the items available in perfmon.
Refer to the self.supported_types keys for the currently supported ‘Performance Objects’ To add logging support for other data you can derive the necessary data from perfmon: ——— perfmon can be run from windows ‘run’ menu by entering ‘perfmon’ and enter. Clicking on the ‘+’ will open the ‘add counters’ menu, From the ‘Add Counters’ dialog, the ‘Performance object’ is the self.support_types key. —> Where spaces are removed and symbols are entered as text (Ex. # == Number, % == Percent) For the items you wish to log add the proper attribute name in the list in the self.supported_types dictionary, keyed by the ‘Performance Object’ name as mentioned above. ——— NOTE: The ‘NETFramework_NETCLRMemory’ key does not seem to log dotnet 2.0 properly.
Initially the python implementation was derived from: http://www.microsoft.com/technet/scriptcenter/scripts/default.mspx?mfr=true »’ def __init__(self,process_name_list=[],perf_object_list=[],filter_list=[]): »’process_names_list == the list of all processes to log (if empty log all) perf_object_list == list of process counters to log filter_list == list of text to filter print_results == boolean, output to stdout »’ pythoncom.CoInitialize() # Needed when run by the same process in a thread self.process_name_list = process_name_list self.perf_object_list = perf_object_list self.filter_list = filter_list self.win32_perf_base = ‘Win32_PerfFormattedData_’ # Define new datatypes here! self.supported_types = < ‘NETFramework_NETCLRMemory’: [ ‘Name’, ‘NumberTotalCommittedBytes’, ‘NumberTotalReservedBytes’, ‘NumberInducedGC’, ‘NumberGen0Collections’, ‘NumberGen1Collections’, ‘NumberGen2Collections’, ‘PromotedMemoryFromGen0’, ‘PromotedMemoryFromGen1’, ‘PercentTimeInGC’, ‘LargeObjectHeapSize’ ], ‘PerfProc_Process’: [ ‘Name’, ‘PrivateBytes’, ‘ElapsedTime’, ‘IDProcess’,# pid ‘Caption’, ‘CreatingProcessID’, ‘Description’, ‘IODataBytesPersec’, ‘IODataOperationsPersec’, ‘IOOtherBytesPersec’, ‘IOOtherOperationsPersec’, ‘IOReadBytesPersec’, ‘IOReadOperationsPersec’, ‘IOWriteBytesPersec’, ‘IOWriteOperationsPersec’ ] >def get_pid_stats(self, pid): this_proc_dict = <> pythoncom.CoInitialize() # Needed when run by the same process in a thread if not self.perf_object_list: perf_object_list = self.supported_types.keys() for counter_type in perf_object_list: strComputer = «.» objWMIService = win32com.client.Dispatch(«WbemScripting.SWbemLocator») objSWbemServices = objWMIService.ConnectServer(strComputer,»rootcimv2″) query_str = »’Select * from %s%s»’ % (self.win32_perf_base,counter_type) colItems = objSWbemServices.ExecQuery(query_str) # «Select * from Win32_PerfFormattedData_PerfProc_Process»)# changed from Win32_Thread if len(colItems) > 0: for objItem in colItems: if hasattr(objItem, ‘IDProcess’) and pid == objItem.IDProcess: for attribute in self.supported_types[counter_type]: eval_str = ‘objItem.%s’ % (attribute) this_proc_dict[attribute] = eval(eval_str) this_proc_dict[‘TimeStamp’] = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S.’) + str(datetime.datetime.now().microsecond)[:3] break return this_proc_dict def get_stats(self): »’ Show process stats for all processes in given list, if none given return all processes If filter list is defined return only the items that match or contained in the list Returns a list of result dictionaries »’ pythoncom.CoInitialize() # Needed when run by the same process in a thread proc_results_list = [] if not self.perf_object_list: perf_object_list = self.supported_types.keys() for counter_type in perf_object_list: strComputer = «.» objWMIService = win32com.client.Dispatch(«WbemScripting.SWbemLocator») objSWbemServices = objWMIService.ConnectServer(strComputer,»rootcimv2″) query_str = »’Select * from %s%s»’ % (self.win32_perf_base,counter_type) colItems = objSWbemServices.ExecQuery(query_str) # «Select * from Win32_PerfFormattedData_PerfProc_Process»)# changed from Win32_Thread try: if len(colItems) > 0: for objItem in colItems: found_flag = False this_proc_dict = <> if not self.process_name_list: found_flag = True else: # Check if process name is in the process name list, allow print if it is for proc_name in self.process_name_list: obj_name = objItem.Name if proc_name.lower() in obj_name.lower(): # will log if contains name found_flag = True break if found_flag: for attribute in self.supported_types[counter_type]: eval_str = ‘objItem.%s’ % (attribute) this_proc_dict[attribute] = eval(eval_str) this_proc_dict[‘TimeStamp’] = datetime.datetime.now().strftime(‘%Y-%m-%d %H:%M:%S.’) + str(datetime.datetime.now().microsecond)[:3] proc_results_list.append(this_proc_dict) except pywintypes.com_error, err_msg: # Ignore and continue (proc_mem_logger calls this function once per second) continue return proc_results_list def get_sys_stats(): »’ Returns a dictionary of the system stats»’ pythoncom.CoInitialize() # Needed when run by the same process in a thread x = winmem() sys_dict = < ‘dwAvailPhys’: x.dwAvailPhys, ‘dwAvailVirtual’:x.dwAvailVirtual >return sys_dict if __name__ == ‘__main__’: # This area used for testing only sys_dict = get_sys_stats() stats_processor = process_stats(process_name_list=[‘process2watch’],perf_object_list=[],filter_list=[]) proc_results = stats_processor.get_stats() for result_dict in proc_results: print result_dict import os this_pid = os.getpid() this_proc_results = stats_processor.get_pid_stats(this_pid) print ‘this proc results:’ print this_proc_results
Ответ 6
«. текущий статус системы (текущий процессор, оперативная память, свободное место на диске и т.д.). И» * nix и платформы Windows «могут быть сложной комбинацией для достижения.
Операционные системы принципиально различаются в том, как они управляют этими ресурсами. Действительно, они отличаются в основных понятиях, таких как определение того, что считается системой, и что считается временем приложения.
«Свободное дисковое пространство»? Что считается «дисковым пространством»? Все разделы всех устройств? Что касается внешних разделов в многозадачной среде?
Я не думаю, что существует достаточно четкое согласие между Windows и * nix, что делает это возможным. В самом деле, между различными операционными системами под Windows не может быть никакого консенсуса. Существует ли один Windows API, который работает как для XP, так и для Vista?
Ответ 7
Я чувствую, что эти ответы были написаны для Python 2, и в любом случае никто не упомянул стандартный пакет resource , доступный для Python 3. Он предоставляет команды для получения ограничений ресурсов для данного процесса (по умолчанию процесс Python-вызова). Это не то же самое, что получать текущее использование ресурсов системой в целом, но оно может решить некоторые из таких же проблем, как например: «Я хочу, чтобы я использовал только X много RAM с этим скриптом».