কোন পাইথন মেমরি প্রোফাইলার প্রস্তাবিত? [বন্ধ]


670

আমি আমার পাইথন অ্যাপ্লিকেশনটির মেমরির ব্যবহারটি জানতে চাই এবং বিশেষত কোন কোড ব্লক / অংশ বা বস্তুগুলি বেশিরভাগ মেমরি গ্রাস করে তা জানতে চাই। গুগল অনুসন্ধানটি বাণিজ্যিকভাবে দেখায় পাইথন মেমরি ভ্যালিডেটর (কেবল উইন্ডোজ)।

এবং ওপেন সোর্সগুলি হলেন পাইসাইট এবং হ্যাপি

আমি কারও চেষ্টা করিনি, তাই আমি জানতে চেয়েছিলাম কোনটি সবচেয়ে ভাল বিবেচনা করা হয়:

  1. সর্বাধিক বিবরণ দেয়।

  2. আমাকে আমার কোডে কমপক্ষে বা কোনও পরিবর্তন করতে হবে।


2
ফাঁসের উত্সগুলি সন্ধানের জন্য আমি অবজেক্টের প্রস্তাব দিই।
পাই

9
@ মাইকিএলএল এর মতো প্রশ্নের জন্য একটি জায়গা আছে: সফ্টওয়্যার প্রস্তাবনা
পোয়িক

2
এটি প্রায়শই পর্যাপ্ত হয়ে থাকে যে আমাদের পরিবর্তে একটি প্রশ্ন অন্য ফোরামে স্থানান্তরিত করতে সক্ষম হওয়া উচিত।
জাবুম্বা

একটি টিপ: যদি কেউ মেমোরির ব্যবহার পরীক্ষা করে দেখতে চান এবং এটি ব্যবহার করতে চান - এটি একটি বড় মাথাব্যথা, কারণ tools সরঞ্জামগুলি কিছুই আউটপুট দেয় নি বা ইভেন্ট শুরু হয়নি। আপনি যদি কোনও ছোট্ট কিছু পরীক্ষা করতে চান তবে ফাংশনটি সরান যা আপনি পৃথক ফাইলের জন্য পরীক্ষা করতে চান এবং এই ফাইলটি একা চালান।
alexche8

উত্তর:


288

হিপি ব্যবহার করা বেশ সহজ। আপনার কোডের এক পর্যায়ে আপনাকে নিম্নলিখিতগুলি লিখতে হবে:

from guppy import hpy
h = hpy()
print(h.heap())

এটি আপনাকে এরকম কিছু আউটপুট দেয়:

Partition of a set of 132527 objects. Total size = 8301532 bytes.
Index  Count   %     Size   % Cumulative  % Kind (class / dict of class)
0  35144  27  2140412  26   2140412  26 str
1  38397  29  1309020  16   3449432  42 tuple
2    530   0   739856   9   4189288  50 dict (no owner)

আপনি কোথায় থেকে অবজেক্টগুলিকে রেফারেন্স করা হয়েছে তা সম্পর্কে এবং এটি সম্পর্কে পরিসংখ্যানগুলি পেতে পারেন তবে কোনওভাবে সেটিতে থাকা দস্তাবেজগুলি কিছুটা বিচ্ছিন্ন।

সেখানে একটি গ্রাফিকাল ব্রাউজারও রয়েছে, টাকায় লেখা।


24
আপনি যদি পাইথন ২. on এ থাকেন তবে আপনার এটির ট্রাঙ্ক সংস্করণটির প্রয়োজন হতে পারে: সোর্সফোর্স.नेट / ট্র্যাকার/… ,pip install https://guppy-pe.svn.sourceforge.net/svnroot/guppy-pe/trunk/guppy
জেমস স্নাইডার

27
ভারী দস্তাবেজগুলি ... ভাল নয়। তবে আমি এই ব্লগ পোস্টটি শুরু করার জন্য খুব সহায়ক বলে মনে করেছি: স্মিরা.আর
জো শ

4
দ্রষ্টব্য, হিপি পাইথন এক্সটেনশনে বরাদ্দ করা মেমরি অন্তর্ভুক্ত করে না। যদি কেউ boost::pythonবস্তুগুলি অন্তর্ভুক্ত করার জন্য হিপি পেতে কোনও প্রক্রিয়া তৈরি করে থাকে তবে কয়েকটি উদাহরণ দেখে ভাল লাগবে!
amos

34
2014-07-06 পর্যন্ত, গুপি পাইথন 3 সমর্থন করে না
কোয়ান্টিন প্রদেট

5
পাইপথন 3 কে গুপ্পি 3 সমর্থন করে এমন গাপির একটি কাঁটাচামচ রয়েছে।
ডেভিড ফস্টার

385

যেহেতু কেউ এটি উল্লেখ করেনি আমি আমার মডিউল মেমরি_প্রফিলারের দিকে নির্দেশ করব যা মেমরির ব্যবহারের লাইন বাই লাইন রিপোর্ট মুদ্রণ করতে সক্ষম এবং ইউনিক্স এবং উইন্ডোজে কাজ করে (এই শেষটির জন্য সামুটির প্রয়োজন)। আউটপুট খুব বিশদ নয় তবে লক্ষ্যটি আপনাকে কোডটি কোথায় আরও মেমরি ব্যবহার করছে এবং বরাদ্দকৃত সামগ্রীর উপর বিশদ বিশ্লেষণ নয় সে সম্পর্কে একটি সংক্ষিপ্ত বিবরণ দেওয়া।

পতাকাটি দিয়ে আপনার ফাংশনটি সজ্জিত করার পরে @profileএবং কোডটি চালানোর পরে -m memory_profilerএটি একটি লাইনে বাই লাইন প্রতিবেদনটি প্রিন্ট করবে:

Line #    Mem usage  Increment   Line Contents
==============================================
     3                           @profile
     4      5.97 MB    0.00 MB   def my_func():
     5     13.61 MB    7.64 MB       a = [1] * (10 ** 6)
     6    166.20 MB  152.59 MB       b = [2] * (2 * 10 ** 7)
     7     13.61 MB -152.59 MB       del b
     8     13.61 MB    0.00 MB       return a

1
আমার ব্যবহারের জন্য - একটি সাধারণ চিত্রের ম্যানিপুলেশন স্ক্রিপ্ট, একটি জটিল সিস্টেম নয়, যা কিছু কার্সার খোলা রেখেছিল - এটি ছিল সেরা সমাধান। আপনার কোডটিতে ন্যূনতম বন্দুক যুক্ত করে নামাতে এবং কী হচ্ছে তা নির্ধারণ করতে খুব সহজ। দ্রুত সমাধানের জন্য উপযুক্ত এবং অন্যান্য অ্যাপ্লিকেশনগুলির জন্য সম্ভবত দুর্দান্ত।
ড্রিফ্যাচ্যাচার 12

10
আমি মেমোরি প্রোফিলারটি দেখতে খুব সহজ এবং সহজেই ব্যবহারযোগ্য বলে মনে করি। আমি প্রতি লাইনে প্রোফাইলিং করতে চাই, প্রতিটি বস্তুতে নয়। লেখার জন্য ধন্যবাদ।
tommy.carstensen

1
@ ফ্যাবিয়ান পেডেগোসা কীভাবে ডোজ মেমরি_প্রফিলার লুপগুলি পরিচালনা করে, এটি লুপ পুনরাবৃত্তির নম্বর সনাক্তকারী করতে পারে?
গ্লেন ফ্লেচার

3
এটি লুপগুলি কেবল তখনই সনাক্ত করে যখন এটি লাইন বাই লাইন পরিমাণের প্রতিবেদন করার চেষ্টা করে এবং এটি সদৃশ লাইনগুলি খুঁজে পায় finds এই ক্ষেত্রে এটি সমস্ত পুনরাবৃত্তির সর্বাধিক গ্রহণ করবে।
ফ্যাবিয়ান পেদ্রিগোসা

1
@FabianPedregosa নেই memory_profilerবাফার তার আউটপুট? আমি হয়ত কিছু ভুল করছি, তবে মনে হচ্ছে এটি সম্পূর্ণ হয়ে গেলে কোনও ফাংশনটির জন্য প্রোফাইলটি ডাম্প করার চেয়ে স্ক্রিপ্টটি শেষ হওয়ার অপেক্ষা করে।
গ্রিনস্টিক

80

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

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.server.quickstart()
    cherrypy.engine.start(blocking=False)

আপনি মেমডেবগ আমদানি করুন এবং কল করুন মেমেডেবগ.স্টার্ট। এখানেই শেষ.

আমি পাইসাইজার বা হেপি চেষ্টা করি নি। আমি অন্যের পর্যালোচনা প্রশংসা করব।

হালনাগাদ

উপরের কোড জন্য CherryPy 2.X, পদ্ধতি সরানো হয়েছে এবং লাগবে না পতাকা। আপনি যদি ব্যবহার করছেনCherryPy 3.Xserver.quickstartengine.startblockingCherryPy 3.X

# memdebug.py

import cherrypy
import dowser

def start(port):
    cherrypy.tree.mount(dowser.Root())
    cherrypy.config.update({
        'environment': 'embedded',
        'server.socket_port': port
    })
    cherrypy.engine.start()

3
তবে এটি কি কেবল চেরিপির জন্য, কীভাবে এটি একটি সিনপল স্ক্রিপ্ট দিয়ে ব্যবহার করবেন?
অনুরাগ ইউনিয়াল

13
এটি চেরিপাইয়ের পক্ষে নয়। চেরিপাইকে একটি জিইউআই টুলকিট হিসাবে ভাবেন।
sanxiyn

1
fwiw, পাইসাইজার পৃষ্ঠা পাইসাইজার .8325.org মনে হচ্ছে হিপি, যা এটি অনুরূপ বলে মনে হয়
জ্যাকব গ্যাব্রিয়েলসন

6
ডোজার নামে ডেনসারের একটি জেনেরিক ডাব্লুএসজিআই পোর্ট রয়েছে, যা আপনি অন্যান্য ওয়েব সার্ভারের সাথেও ব্যবহার করতে পারেন: পিপিআইপিথন.আরপিপি / ডিজার
জো শ

2
চেরিপি ৩.১ চেরিপি.সার্ভার.কুইকস্টার্ট () সরিয়ে ফেলেছে, তাই কেবল চেরিপি.ইঞ্জিন.স্টার্ট () ব্যবহার করুন
ম্যাটস লিন্ড

66

অবজেক্ট লাইব্রেরি বিবেচনা করুন (দেখুন)http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks উদাহরণ ব্যবহারের ক্ষেত্রে)।


7
আপত্তিগ্রন্থ আমাকে আজ একটি স্মৃতি ফাঁসির সমস্যা সমাধান করতে সহায়তা করেছে। objgraph.show_growth () বিশেষভাবে উপকারী ছিল
Ngure Nyaga

1
আমিও খুব সহজ উপায়ে পেয়েছি obj আপনি objgraph.by_type('dict')সেই সমস্ত অপ্রত্যাশিত dictবস্তুগুলি কোথা থেকে এসেছে তা বোঝার মতো কাজ করতে পারেন ।
ডিনো

18

মাইপি পাইথনের মেমোরি ইউজ প্রোফাইল Profile এই টুলসেটটির ফোকাস মেমরি ফাঁসের সনাক্তকরণের উপরে রাখা হয়েছে।

মাইপি পাইথন অ্যাপ্লিকেশনগুলির সনাক্তকরণ মেমরি ফুটোতে বিকাশকারীদের সহায়তা করার চেষ্টা করে। এটি রানটাইম চলাকালীন মেমরির ব্যবহারের ট্র্যাকিং এবং যে জিনিসগুলি ফাঁস হচ্ছে তা সনাক্তকরণ সক্ষম করে। অতিরিক্তভাবে, এমন সরঞ্জাম সরবরাহ করা হয় যা প্রকাশিত না হওয়া অবজেক্টের উত্স সনাক্ত করতে দেয়।


13

আমি পাইথনের মেমোপ্রফ নামে একটি মেমরি প্রোফাইল বিকাশ করছি:

http://jmdana.github.io/memprof/

এটি আপনাকে সজ্জিত পদ্ধতির প্রয়োগের সময় আপনার ভেরিয়েবলের মেমরির ব্যবহার লগ এবং প্লট করতে দেয়। আপনাকে কেবল এটি ব্যবহার করে গ্রন্থাগারটি আমদানি করতে হবে:

from memprof import memprof

এবং আপনার পদ্ধতিটি ব্যবহার করে সজ্জিত করুন:

@memprof

প্লটগুলি কেমন দেখায় তার এটি উদাহরণ:

এখানে চিত্র বর্ণনা লিখুন

প্রকল্পটি গিটহাবে হোস্ট করা হয়েছে:

https://github.com/jmdana/memprof


3
আমি কিভাবে এটা ব্যবহার করব? ক, খ, গ কি?
tommy.carstensen

@ tommy.carstensen a, bএবং cভেরিয়েবল নাম। আপনি ডকুমেন্টেশন github.com/jmdana/memprof এ খুঁজে পেতে পারেন । আপনার যদি কোনও প্রশ্ন থাকে তবে দয়া করে গিথুবে কোনও সমস্যা জমা দিতে বা নথিভুক্তিতে পাওয়া যায় এমন মেলিং তালিকায় ইমেল প্রেরণে নির্দ্বিধায় অনুভব করুন।
jmdana

12

আমি মেলিয়া হিপি বা পাইসাইজারের চেয়ে অনেক বেশি কার্যকরী বলে মনে করেছি। আপনি যদি একটি wsgi ওয়েবঅ্যাপ্লিকেশনটি চলমান হতে ঘটতে থাকে, তাহলে Dozer Dowser একটি চমৎকার মিডলওয়্যার মোড়কের হয়


8

এছাড়াও চেষ্টা করুন pytracemalloc প্রকল্পের যা প্রতি পাইথন লাইন সংখ্যা মেমোরি ব্যবহার প্রদান করে।

সম্পাদনা (2014/04): স্ন্যাপশট বিশ্লেষণ করার জন্য এটিতে এখন Qt GUI রয়েছে।


4
tracemallocপাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ এখন। ডকস.পিথন.আর. / ৩
ড্যান মিলন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.