python পাইথন প্রক্রিয়া দ্বারা ব্যবহৃত মোট মেমরি?




পাইথন প্রোগ্রামিং বাংলা বই pdf (10)

Heapy (এবং বন্ধুরা) আপনি খুঁজছেন কি হতে পারে।

এছাড়াও, ক্যাশেগুলির সাধারণত আপনি যে সমস্যার সমস্যার কথা বলছেন তার সমাধান করার জন্য তাদের আকারের একটি নির্দিষ্ট উচ্চ সীমা আছে। উদাহরণস্বরূপ, এই LRU ক্যাশে সজ্জা চেক আউট।

পাইথন প্রোগ্রামের জন্য বর্তমানে এটি কতটি মেমরি ব্যবহার করছে তা নির্ধারণ করার উপায় আছে? আমি একটি একক বস্তুর জন্য মেমরি ব্যবহার সম্পর্কে আলোচনা দেখেছি, তবে আমার যা প্রয়োজন তা হলো প্রক্রিয়াটির মোট মেমরির ব্যবহার, যাতে আমি ক্যাশেড ডেটা বাতিল করা শুরু করার সময় নির্ধারণ করতে পারি।


ইউনিক্স ভিত্তিক সিস্টেমগুলির জন্য (লিনাক্স, ম্যাক ওএস এক্স, সোলারিস), আপনি standard লাইব্রেরী মডিউল resource থেকে getrusage() ফাংশনটি ব্যবহার করতে পারেন। ফলে বস্তুটির বৈশিষ্ট্যগুলি_আরএক্সআরআরএস ru_maxrss , যা কলিং প্রক্রিয়ার জন্য সর্বোচ্চ স্মৃতি ব্যবহার করে:

>>> resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
2656  # peak memory usage (kilobytes on Linux, bytes on OS X)

পাইথন ডক্স ইউনিট নোট না। মূল্যের জন্য ইউনিট পরীক্ষা করতে আপনার নির্দিষ্ট সিস্টেমের man getrusage.2 পৃষ্ঠাটি পড়ুন। উবুন্টু 18.04 এ, ইউনিটটি কিলোবাইট হিসাবে উল্লেখ করা হয়। ম্যাক ওএস এক্স এ, এটি বাইট।

getrusage() প্রসেসের জন্য, এবং (কিছু সিস্টেমে) resource.RUSAGE_BOTH । RUSAGE_BOTH মোট (স্ব এবং শিশু) প্রক্রিয়া ব্যবহারের জন্য getrusage() ফাংশনটিও resource.RUSAGE_CHILDREN দেওয়া যেতে পারে।

যদি আপনি শুধুমাত্র লিনাক্স সম্পর্কে যত্নশীল হন, তবে আপনি বিকল্পটি /proc/self/status বা /proc/self/statm ফাইলটি পড়তে পারেন এবং এই প্রশ্নের জন্য অন্য উত্তরগুলিতে বর্ণিত বর্ণনাটি এবং এটিও।


Here একটি কার্যকর সমাধান যা বিভিন্ন অপারেটিং সিস্টেমের জন্য কাজ করে, যেমন লিনাক্স, উইন্ডোজ 7, ​​ইত্যাদি।

import os
import psutil
process = psutil.Process(os.getpid())
print(process.memory_info().rss)  # in bytes 

আমার বর্তমান Python 2.7 ইনস্টল করুন, শেষ লাইন হতে হবে

print(process.get_memory_info()[0])

পরিবর্তে (API এ একটি পরিবর্তন ছিল)।

দ্রষ্টব্য: এটি ইনস্টল না থাকলে pip install psutil ইনস্টল করুন।


আমি it পছন্দ it , @ বায়ারের জন্য আপনাকে ধন্যবাদ। আমি এখন, একটি নির্দিষ্ট প্রক্রিয়া গণনা টুল পেতে।

# Megabyte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum/1024 " MB"}'
87.9492 MB

# Byte.
$ ps aux | grep python | awk '{sum=sum+$6}; END {print sum " KB"}'
90064 KB

আমার প্রক্রিয়া তালিকা সংযুক্ত করুন।

$ ps aux  | grep python
root       943  0.0  0.1  53252  9524 ?        Ss   Aug19  52:01 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root       950  0.6  0.4 299680 34220 ?        Sl   Aug19 568:52 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
root      3803  0.2  0.4 315692 36576 ?        S    12:43   0:54 /usr/bin/python /usr/local/bin/beaver -c /etc/beaver/beaver.conf -l /var/log/beaver.log -P /var/run/beaver.pid
jonny    23325  0.0  0.1  47460  9076 pts/0    S+   17:40   0:00 python
jonny    24651  0.0  0.0  13076   924 pts/4    S+   18:06   0:00 grep python

উল্লেখ


Python bayer এর উত্তর পেতে sh এবং os ব্যবহার করে।

float(sh.awk(sh.ps('u','-p',os.getpid()),'{sum=sum+$6}; END {print sum/1024}'))

উত্তর মেগাবাইটে হয়।


import os, win32api, win32con, win32process
han = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION|win32con.PROCESS_VM_READ, 0, os.getpid())
process_memory = int(win32process.GetProcessMemoryInfo(han)['WorkingSetSize'])

লিনাক্সে বর্তমান প্রক্রিয়াটির বর্তমান মেমরি ব্যবহার, পাইথন 2, পাইথন 3, এবং পাইপি, কোনও আমদানি ছাড়াই:

def getCurrentMemoryUsage():
    ''' Memory usage in kB '''

    with open('/proc/self/status') as f:
        memusage = f.read().split('VmRSS:')[1].split('\n')[0][:-3]

    return int(memusage.strip())

লিনাক্স 4.4 এবং 4.9 তে পরীক্ষা করা হলেও একটি প্রাথমিক লিনাক্স সংস্করণও কাজ করা উচিত।

man proc এবং /proc/$PID/status ফাইলে তথ্য অনুসন্ধানের জন্য, এটি কিছু ক্ষেত্রের জন্য ন্যূনতম সংস্করণ উল্লেখ করে (যেমন "ভিএমপিটিই" এর জন্য লিনাক্স 2.6.10), কিন্তু "ভিএমআরএসএস" ক্ষেত্র (যা আমি এখানে ব্যবহার করি) ) যেমন কোন উল্লেখ আছে। অতএব আমি এটা একটি প্রাথমিক সংস্করণ থেকে সেখানে হয়েছে অনুমান।


/proc/self/statm /proc/self/status : /proc/self/statm । এটি মাত্র কয়েক statistics একটি স্থান সীমিত তালিকা। উভয় ফাইল সবসময় উপস্থিত থাকলে আমি বলতে সক্ষম হয়েছে না।

জন্য / proc / [PID] / statm

পৃষ্ঠা পরিমাপ, মেমরি ব্যবহার সম্পর্কে তথ্য প্রদান করে। কলামগুলি হল:

  • আকার (1) মোট প্রোগ্রামের আকার (VMSize হিসাবে / proc / [pid] / স্থিতিতে)
  • আবাসিক (2) আবাসিক সেট সাইজ (ভিএমআরএসএস / প্রসেস / [পিআইডি] / স্ট্যাটাসের মতো)
  • ভাগ করা (3) আবাসিক ভাগ করা পৃষ্ঠাগুলির সংখ্যা (অর্থাত্, একটি ফাইল দ্বারা সমর্থিত) (RssFile + রশি Shemem / proc / [pid] / স্থিতিতে)
  • পাঠ্য (4) পাঠ্য (কোড)
  • lib (5) লাইব্রেরি (Linux 2.6 থেকে অব্যবহৃত; সর্বদা 0)
  • তথ্য (6) তথ্য + স্ট্যাক
  • DT (7) নোংরা পৃষ্ঠাগুলি (লিনাক্স 2.6 থেকে অব্যবহৃত; সর্বদা 0)

এখানে একটি সহজ উদাহরণ:

from pathlib import Path
from resource import getpagesize

PAGESIZE = getpagesize()
PATH = Path('/proc/self/statm')


def get_resident_set_size() -> int:
    """Return the current resident set size in bytes."""
    # statm columns are: size resident shared text lib data dt
    statm = PATH.read_text()
    fields = statm.split()
    return int(fields[1]) * PAGESIZE


data = []
start_memory = get_resident_set_size()
for _ in range(10):
    data.append('X' * 100000)
    print(get_resident_set_size() - start_memory)

এটি এমন একটি তালিকা তৈরি করে যা এরকম কিছু দেখায়:

0
0
368640
368640
368640
638976
638976
909312
909312
909312

আপনি প্রায় 100,000 বাইটের প্রায় 3 বরাদ্দের পরে এটি প্রায় 300,000 বাইট দ্বারা চলা যায় দেখতে পারেন।


নিচে আমার ফাংশন সজ্জাকারী যা ফাংশন কলের পূর্বে এই প্রক্রিয়াটি কত মেমরির ব্যবহার করে, ফাংশন কলের পরে এটি কতটি মেমরি ব্যবহার করে এবং ফাংশনটি কতক্ষণ কার্যকর হয় তা ট্র্যাক করতে দেয়।

import time
import os
import psutil


def elapsed_since(start):
    return time.strftime("%H:%M:%S", time.gmtime(time.time() - start))


def get_process_memory():
    process = psutil.Process(os.getpid())
    return process.get_memory_info().rss


def track(func):
    def wrapper(*args, **kwargs):
        mem_before = get_process_memory()
        start = time.time()
        result = func(*args, **kwargs)
        elapsed_time = elapsed_since(start)
        mem_after = get_process_memory()
        print("{}: memory before: {:,}, after: {:,}, consumed: {:,}; exec time: {}".format(
            func.__name__,
            mem_before, mem_after, mem_after - mem_before,
            elapsed_time))
        return result
    return wrapper

সুতরাং, যখন আপনি এটি সঙ্গে সজ্জিত কিছু ফাংশন আছে

from utils import track

@track
def list_create(n):
    print("inside list create")
    x = [1] * n
    return x

আপনি এই আউটপুট দেখতে সক্ষম হবে:

inside list create
list_create: memory before: 45,928,448, after: 46,211,072, consumed: 282,624; exec time: 00:00:00

ইউনিক্সে, আপনি এটি নিরীক্ষণ করতে ps সরঞ্জামটি ব্যবহার করতে পারেন:

$ ps u -p 1347 | awk '{sum=sum+$6}; END {print sum/1024}'

যেখানে 1347 কিছু প্রক্রিয়া আইডি। এছাড়াও, ফলাফল এমবি হয়।





memory-management