Memray adalah profiler memori untuk Python. Itu dapat melacak alokasi memori dalam kode Python, dalam modul ekstensi asli, dan dalam penerjemah Python itu sendiri. Ini dapat menghasilkan beberapa jenis laporan berbeda untuk membantu Anda menganalisis data penggunaan memori yang diambil. Meskipun umumnya digunakan sebagai alat CLI, alat ini juga dapat digunakan sebagai pustaka untuk melakukan tugas pembuatan profil yang lebih terperinci.
Fitur penting:
Memray dapat membantu mengatasi masalah berikut:
Catatan Memray hanya berfungsi di Linux dan MacOS, dan tidak dapat diinstal pada platform lain.
Kami terus mencari masukan dari komunitas kami yang luar biasa ❤️. Jika Anda telah menggunakan Memray untuk memecahkan masalah, membuat profil aplikasi, menemukan kebocoran memori, atau apa pun, beri tahu kami! Kami ingin sekali mendengar pengalaman Anda dan bagaimana Memray membantu Anda.
Silakan pertimbangkan untuk menulis cerita Anda di halaman diskusi Kisah Sukses.
Ini benar-benar membuat perbedaan!
Memray memerlukan Python 3.7+ dan dapat diinstal dengan mudah menggunakan alat pengemasan Python yang paling umum. Kami merekomendasikan menginstal rilis stabil terbaru dari PyPI dengan pip:
python3 -m pip install memray
Perhatikan bahwa Memray berisi ekstensi C sehingga rilis didistribusikan sebagai roda biner serta kode sumber. Jika roda biner tidak tersedia untuk sistem Anda (Linux x86/x64 atau macOS), Anda harus memastikan bahwa semua dependensi terpenuhi pada sistem tempat Anda melakukan instalasi.
Jika Anda ingin membangun Memray dari sumber, Anda memerlukan dependensi biner berikut di sistem Anda:
Periksa manajer paket Anda tentang cara menginstal dependensi ini (misalnya apt-get install build-essential python3-dev libdebuginfod-dev libunwind-dev liblz4-dev
di sistem berbasis Debian atau brew install lz4
di MacOS). Perhatikan bahwa Anda mungkin perlu mengajari kompiler di mana menemukan file header dan pustaka dependensi. Misalnya, di MacOS dengan brew
Anda mungkin perlu menjalankan:
export CFLAGS= " -I $( brew --prefix lz4 ) /include " LDFLAGS= " -L $( brew --prefix lz4 ) /lib -Wl,-rpath, $( brew --prefix lz4 ) /lib "
sebelum menginstal memray
. Periksa dokumentasi manajer paket Anda untuk mengetahui lokasi file header dan perpustakaan untuk informasi lebih detail.
Jika Anda membangun di MacOS, Anda juga perlu menetapkan target penerapan.
export MACOSX_DEPLOYMENT_TARGET=10.14
Setelah Anda menginstal dependensi biner, Anda dapat mengkloning repositori dan mengikuti proses pembuatan normal:
git clone [email protected]:bloomberg/memray.git memray
cd memray
python3 -m venv ../memray-env/ # just an example, put this wherever you want
source ../memray-env/bin/activate
python3 -m pip install --upgrade pip
python3 -m pip install -e . -r requirements-test.txt -r requirements-extra.txt
Ini akan menginstal Memray di lingkungan virtual dalam mode pengembangan ( -e
dari perintah pip install
terakhir).
Jika Anda berencana untuk berkontribusi kembali, Anda harus memasang kait pra-komitmen:
pre-commit install
Ini akan memastikan bahwa kontribusi Anda lolos pemeriksaan linting kami.
Anda dapat menemukan dokumentasi terbaru yang tersedia di sini.
Ada banyak cara untuk menggunakan Memray. Cara termudah adalah menggunakannya sebagai alat baris perintah untuk menjalankan skrip, aplikasi, atau perpustakaan Anda.
usage: memray [-h] [-v] {run,flamegraph,table,live,tree,parse,summary,stats} ...
Memory profiler for Python applications
Run `memray run` to generate a memory profile report, then use a reporter command
such as `memray flamegraph` or `memray table` to convert the results into HTML.
Example:
$ python3 -m memray run -o output.bin my_script.py
$ python3 -m memray flamegraph output.bin
positional arguments:
{run,flamegraph,table,live,tree,parse,summary,stats}
Mode of operation
run Run the specified application and track memory usage
flamegraph Generate an HTML flame graph for peak memory usage
table Generate an HTML table with all records in the peak memory usage
live Remotely monitor allocations in a text-based interface
tree Generate a tree view in the terminal for peak memory usage
parse Debug a results file by parsing and printing each record in it
summary Generate a terminal-based summary report of the functions that allocate most memory
stats Generate high level stats of the memory usage in the terminal
optional arguments:
-h, --help Show this help message and exit
-v, --verbose Increase verbosity. Option is additive and can be specified up to 3 times
-V, --version Displays the current version of Memray
Please submit feedback, ideas, and bug reports by filing a new issue at https://github.com/bloomberg/memray/issues
Untuk menggunakan Memray melalui skrip atau satu file python, Anda dapat menggunakan:
python3 -m memray run my_script.py
Jika Anda biasanya menjalankan aplikasi dengan python3 -m my_module
, Anda dapat menggunakan flag -m
dengan memray run
:
python3 -m memray run -m my_module
Anda juga dapat memanggil Memray sebagai alat baris perintah tanpa harus menggunakan -m
untuk memanggilnya sebagai modul:
memray run my_script.py
memray run -m my_module
Outputnya akan berupa file biner (seperti memray-my_script.2369.bin
) yang dapat Anda analisis dengan berbagai cara. Salah satu caranya adalah dengan menggunakan perintah memray flamegraph
untuk menghasilkan grafik nyala:
memray flamegraph my_script.2369.bin
Ini akan menghasilkan file HTML dengan grafik nyala penggunaan memori yang dapat Anda periksa dengan browser favorit Anda. Ada beberapa reporter lain yang dapat Anda gunakan untuk menghasilkan jenis laporan lain, beberapa di antaranya menghasilkan keluaran berbasis terminal dan beberapa di antaranya menghasilkan file HTML. Berikut adalah contoh flamegraph Memray:
Jika Anda menginginkan cara yang mudah dan nyaman untuk menggunakan memray
di rangkaian pengujian Anda, Anda dapat mempertimbangkan untuk menggunakan pytest-memray. Setelah terinstal, plugin pytest ini memungkinkan Anda menambahkan --memray
ke pemanggilan baris perintah:
pytest --memray tests/
Dan secara otomatis akan mendapat laporan seperti ini:
python3 -m pytest tests --memray
=============================================================================================================================== test session starts ================================================================================================================================
platform linux -- Python 3.8.10, pytest-6.2.4, py-1.10.0, pluggy-0.13.1
rootdir: /mypackage, configfile: pytest.ini
plugins: cov-2.12.0, memray-0.1.0
collected 21 items
tests/test_package.py ..................... [100%]
================================================================================================================================= MEMRAY REPORT ==================================================================================================================================
Allocations results for tests/test_package.py::some_test_that_allocates
? Total memory allocated: 24.4MiB
? Total allocations: 33929
Histogram of allocation sizes: |▂ █ |
? Biggest allocating functions:
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 3.0MiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 2.3MiB
- _visit:/opt/bb/lib/python3.8/site-packages/astroid/transforms.py:62 -> 576.0KiB
- parse:/opt/bb/lib/python3.8/ast.py:47 -> 517.6KiB
- __init__:/opt/bb/lib/python3.8/site-packages/astroid/node_classes.py:1353 -> 512.0KiB
Anda juga dapat menggunakan beberapa penanda yang disertakan untuk membuat pengujian gagal jika pelaksanaan pengujian tersebut mengalokasikan lebih banyak memori daripada yang diperbolehkan:
@ pytest . mark . limit_memory ( "24 MB" )
def test_foobar ():
# do some stuff that allocates memory
Untuk mempelajari lebih lanjut tentang bagaimana plugin dapat digunakan dan dikonfigurasi, lihat dokumentasi plugin.
Memray mendukung pelacakan fungsi C/C++ asli serta fungsi Python. Ini bisa sangat berguna ketika membuat profil aplikasi yang memiliki ekstensi C (seperti numpy
atau pandas
) karena ini memberikan gambaran menyeluruh tentang berapa banyak memori yang dialokasikan oleh ekstensi tersebut dan berapa banyak yang dialokasikan oleh Python itu sendiri.
Untuk mengaktifkan pelacakan asli, Anda perlu memberikan argumen --native
saat menggunakan subperintah run
:
memray run --native my_script.py
Ini secara otomatis akan menambahkan informasi asli ke file hasil dan akan secara otomatis digunakan oleh reporter mana pun (seperti reporter flamegraph atau tabel). Artinya, alih-alih melihat ini di grafik api:
Anda sekarang dapat melihat apa yang terjadi di dalam panggilan Python:
Reporter menampilkan bingkai asli dalam warna yang berbeda dari bingkai Python. Mereka juga dapat dibedakan dengan melihat lokasi file dalam sebuah bingkai (bingkai Python umumnya akan dihasilkan dari file dengan ekstensi .py sedangkan bingkai asli akan dihasilkan dari file dengan ekstensi seperti .c, .cpp atau .h).
Mode langsung Memray menjalankan skrip atau modul dalam antarmuka berbasis terminal yang memungkinkan Anda memeriksa penggunaan memorinya secara interaktif saat dijalankan. Ini berguna untuk men-debug skrip atau modul yang memerlukan waktu lama untuk dijalankan atau yang memperlihatkan beberapa pola memori kompleks. Anda dapat menggunakan opsi --live
untuk menjalankan skrip atau modul dalam mode live:
memray run --live my_script.py
atau jika Anda ingin menjalankan modul:
memray run --live -m my_module
Ini akan menampilkan antarmuka TUI berikut di terminal Anda:
Hasilnya ditampilkan dalam urutan total memori yang dialokasikan oleh suatu fungsi dan subfungsi yang dipanggil olehnya. Anda dapat mengubah urutannya dengan pintasan keyboard berikut:
t (default): Urutkan berdasarkan total memori
o: Urutkan berdasarkan memori sendiri
a: Urutkan berdasarkan jumlah alokasi
Di sebagian besar terminal, Anda juga dapat mengklik tombol "Urutkan berdasarkan Total", "Urutkan berdasarkan Milik", dan "Urutkan berdasarkan Alokasi" di footer.
Judul kolom yang diurutkan digarisbawahi.
Secara default, perintah live akan menampilkan thread utama program. Anda dapat melihat rangkaian program yang berbeda dengan menekan tombol lebih besar dari dan kurang dari, <
dan >
. Di sebagian besar terminal, Anda juga dapat mengklik tombol "Thread Sebelumnya" dan "Thread Berikutnya" di footer.
Selain melacak proses Python dari CLI menggunakan memray run
, dimungkinkan juga untuk mengaktifkan pelacakan secara terprogram dalam program Python yang sedang berjalan.
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
Untuk detailnya, lihat dokumentasi API.
Memray berlisensi Apache-2.0, seperti yang ditemukan dalam file LISENSI.
Proyek ini telah mengadopsi Kode Etik. Jika Anda memiliki kekhawatiran tentang Kode, atau perilaku yang Anda alami dalam proyek ini, silakan hubungi kami di [email protected].
Jika Anda yakin telah mengidentifikasi kerentanan keamanan dalam proyek ini, silakan kirim email ke tim proyek di [email protected], dengan merinci dugaan masalah dan metode apa pun yang Anda temukan untuk mereproduksinya.
Harap JANGAN membuka masalah di repositori GitHub, karena kami lebih memilih merahasiakan laporan kerentanan hingga kami memiliki kesempatan untuk meninjau dan mengatasinya.
Kami menyambut kontribusi Anda untuk membantu kami meningkatkan dan memperluas proyek ini!
Di bawah ini Anda akan menemukan beberapa langkah dasar yang diperlukan untuk dapat berkontribusi pada proyek. Jika Anda memiliki pertanyaan tentang proses ini atau aspek lain apa pun dalam berkontribusi pada proyek sumber terbuka Bloomberg, silakan kirim email ke [email protected] dan kami akan menjawab pertanyaan Anda secepat mungkin.
Karena proyek ini didistribusikan berdasarkan ketentuan lisensi sumber terbuka, kontribusi yang Anda berikan dilisensikan berdasarkan ketentuan yang sama. Agar kami dapat menerima kontribusi Anda, kami memerlukan konfirmasi eksplisit dari Anda bahwa Anda mampu dan bersedia memberikannya berdasarkan ketentuan ini, dan mekanisme yang kami gunakan untuk melakukan hal ini disebut Surat Keterangan Asal Pengembang (DCO) . Ini sangat mirip dengan proses yang digunakan oleh kernel Linux, Samba, dan banyak proyek open source besar lainnya.
Untuk berpartisipasi berdasarkan ketentuan ini, yang harus Anda lakukan hanyalah menyertakan baris seperti berikut sebagai baris terakhir pesan penerapan untuk setiap penerapan dalam kontribusi Anda:
Signed-Off-By: Random J. Developer <[email protected]>
Cara termudah untuk melakukannya adalah dengan menambahkan -s
atau --signoff
ke perintah git commit
Anda.
Anda harus menggunakan nama asli Anda (maaf, tidak ada nama samaran, dan tidak ada kontribusi anonim).