python - যবহ - পাইথন প্রোগ্রামিং বাংলা বই pdf




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

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

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

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

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


আমি 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

উল্লেখ


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

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

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


উইন্ডোজ, আপনি WMI ব্যবহার করতে পারেন ( হোম পেজ , cheeseshop ):


def memory():
    import os
    from wmi import WMI
    w = WMI('.')
    result = w.query("SELECT WorkingSet FROM Win32_PerfRawData_PerfProc_Process WHERE IDProcess=%d" % os.getpid())
    return int(result[0].WorkingSet)

লিনাক্সে (পাইথন কুকবুক থেকে http://code.activestate.com/recipes/286222/ :

import os
_proc_status = '/proc/%d/status' % os.getpid()

_scale = {'kB': 1024.0, 'mB': 1024.0*1024.0,
          'KB': 1024.0, 'MB': 1024.0*1024.0}

def _VmB(VmKey):
    '''Private.
    '''
    global _proc_status, _scale
     # get pseudo file  /proc/<pid>/status
    try:
        t = open(_proc_status)
        v = t.read()
        t.close()
    except:
        return 0.0  # non-Linux?
     # get VmKey line e.g. 'VmRSS:  9999  kB\n ...'
    i = v.index(VmKey)
    v = v[i:].split(None, 3)  # whitespace
    if len(v) < 3:
        return 0.0  # invalid format?
     # convert Vm value to bytes
    return float(v[1]) * _scale[v[2]]


def memory(since=0.0):
    '''Return memory usage in bytes.
    '''
    return _VmB('VmSize:') - since


def resident(since=0.0):
    '''Return resident memory usage in bytes.
    '''
    return _VmB('VmRSS:') - since


def stacksize(since=0.0):
    '''Return stack size in bytes.
    '''
    return _VmB('VmStk:') - since

পাইথন 3.6 এবং psutil 5.4.5 এর জন্য here তালিকাভুক্ত memory_percent() ফাংশনটি ব্যবহার করা সহজ।

import os
import psutil
process = psutil.Process(os.getpid())
print(process.memory_percent())

লিনাক্সে বর্তমান প্রক্রিয়াটির বর্তমান মেমরি ব্যবহার, পাইথন 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), কিন্তু "ভিএমআরএসএস" ক্ষেত্র (যা আমি এখানে ব্যবহার করি) ) যেমন কোন উল্লেখ আছে। অতএব আমি এটা একটি প্রাথমিক সংস্করণ থেকে সেখানে হয়েছে অনুমান।


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

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


/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 বাইট দ্বারা চলা যায় দেখতে পারেন।





memory-management