Memray เป็นตัวสร้างโปรไฟล์หน่วยความจำสำหรับ Python สามารถติดตามการจัดสรรหน่วยความจำในโค้ด Python ในโมดูลส่วนขยายดั้งเดิม และในล่าม Python เอง โดยสามารถสร้างรายงานประเภทต่างๆ ได้หลายประเภทเพื่อช่วยคุณวิเคราะห์ข้อมูลการใช้งานหน่วยความจำที่บันทึกไว้ แม้ว่าโดยทั่วไปจะใช้เป็นเครื่องมือ CLI แต่ก็สามารถใช้เป็นไลบรารีเพื่อทำงานโปรไฟล์ที่มีรายละเอียดมากขึ้นได้
คุณสมบัติเด่น:
Memray สามารถช่วยแก้ไขปัญหาต่อไปนี้:
หมายเหตุ Memray ใช้งานได้บน Linux และ MacOS เท่านั้น และไม่สามารถติดตั้งบนแพลตฟอร์มอื่นได้
เรามองหาคำติชมจากชุมชนที่ยอดเยี่ยมของเราอย่างต่อเนื่อง ❤️ หากคุณใช้ Memray เพื่อแก้ไขปัญหา สร้างโปรไฟล์แอปพลิเคชัน ค้นหาหน่วยความจำรั่ว หรือสิ่งอื่นใด โปรดแจ้งให้เราทราบ! เราอยากได้ยินเกี่ยวกับประสบการณ์ของคุณและวิธีที่ Memray ช่วยคุณ
โปรดพิจารณาเขียนเรื่องราวของคุณในหน้าอภิปรายเรื่องความสำเร็จ
มันสร้างความแตกต่างจริงๆ!
Memray ต้องการ Python 3.7+ และสามารถติดตั้งได้อย่างง่ายดายโดยใช้เครื่องมือแพ็คเกจ Python ทั่วไป เราขอแนะนำให้ติดตั้งเวอร์ชันเสถียรล่าสุดจาก PyPI ด้วย pip:
python3 -m pip install memray
โปรดสังเกตว่า Memray มีส่วนขยาย C ดังนั้นการเผยแพร่จึงถูกแจกจ่ายในรูปแบบไบนารี่วีลและซอร์สโค้ด หากไม่มีวงล้อไบนารี่สำหรับระบบของคุณ (Linux x86/x64 หรือ macOS) คุณจะต้องตรวจสอบให้แน่ใจว่าการขึ้นต่อกันทั้งหมดเป็นไปตามระบบที่คุณกำลังทำการติดตั้ง
หากคุณต้องการสร้าง Memray จากแหล่งที่มา คุณต้องมีการพึ่งพาไบนารีต่อไปนี้ในระบบของคุณ:
ตรวจสอบตัวจัดการแพ็คเกจของคุณเกี่ยวกับวิธีติดตั้งการขึ้นต่อกันเหล่านี้ (เช่น apt-get install build-essential python3-dev libdebuginfod-dev libunwind-dev liblz4-dev
ในระบบที่ใช้ Debian หรือ brew install lz4
ใน MacOS) โปรดทราบว่าคุณอาจต้องสอนคอมไพเลอร์ว่าจะค้นหาไฟล์ส่วนหัวและไลบรารีของการขึ้นต่อกันได้ที่ไหน ตัวอย่างเช่น ใน MacOS ที่มี brew
คุณอาจต้องเรียกใช้:
export CFLAGS= " -I $( brew --prefix lz4 ) /include " LDFLAGS= " -L $( brew --prefix lz4 ) /lib -Wl,-rpath, $( brew --prefix lz4 ) /lib "
ก่อนติดตั้ง memray
ตรวจสอบเอกสารของผู้จัดการแพ็คเกจของคุณเพื่อทราบตำแหน่งของไฟล์ส่วนหัวและไลบรารีสำหรับข้อมูลโดยละเอียดเพิ่มเติม
หากคุณกำลังสร้างบน MacOS คุณจะต้องกำหนดเป้าหมายการปรับใช้ด้วย
export MACOSX_DEPLOYMENT_TARGET=10.14
เมื่อคุณติดตั้งการพึ่งพาไบนารีแล้ว คุณสามารถโคลนพื้นที่เก็บข้อมูลและปฏิบัติตามกระบวนการสร้างปกติ:
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
สิ่งนี้จะติดตั้ง Memray ในสภาพแวดล้อมเสมือนในโหมดการพัฒนา ( -e
ของคำสั่ง pip install
สุดท้าย)
หากคุณวางแผนที่จะสนับสนุนกลับ คุณควรติดตั้ง hooks ที่คอมมิตล่วงหน้า:
pre-commit install
เพื่อให้แน่ใจว่าการบริจาคของคุณผ่านการตรวจสอบผ้าสำลีของเรา
คุณสามารถค้นหาเอกสารล่าสุดได้ที่นี่
มีหลายวิธีในการใช้ Memray วิธีที่ง่ายที่สุดคือใช้เป็นเครื่องมือบรรทัดคำสั่งเพื่อเรียกใช้สคริปต์ แอปพลิเคชัน หรือไลบรารีของคุณ
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
หากต้องการใช้ Memray บนสคริปต์หรือไฟล์ Python ไฟล์เดียว คุณสามารถใช้:
python3 -m memray run my_script.py
หากปกติคุณรันแอปพลิเคชันด้วย python3 -m my_module
คุณสามารถใช้แฟล็ก -m
กับ memray run
:
python3 -m memray run -m my_module
คุณยังสามารถเรียกใช้ Memray เป็นเครื่องมือบรรทัดคำสั่งโดยไม่ต้องใช้ -m
เพื่อเรียกใช้เป็นโมดูล:
memray run my_script.py
memray run -m my_module
ผลลัพธ์จะเป็นไฟล์ไบนารี (เช่น memray-my_script.2369.bin
) ที่คุณสามารถวิเคราะห์ได้หลายวิธี วิธีหนึ่งคือการใช้คำสั่ง memray flamegraph
เพื่อสร้างกราฟเปลวไฟ:
memray flamegraph my_script.2369.bin
สิ่งนี้จะสร้างไฟล์ HTML พร้อมกราฟเปลวไฟของการใช้หน่วยความจำที่คุณสามารถตรวจสอบด้วยเบราว์เซอร์ที่คุณชื่นชอบ มีผู้รายงานอื่นๆ อีกหลายรายที่คุณสามารถใช้สร้างรายงานประเภทอื่นๆ ได้ โดยบางรายการสร้างเอาต์พุตแบบเทอร์มินัล และบางรายการสร้างไฟล์ HTML นี่คือตัวอย่างของกราฟฟลามิงโก Memray:
หากคุณต้องการวิธีที่ง่ายและสะดวกในการใช้ memray
ในชุดการทดสอบของคุณ คุณสามารถลองใช้ pytest-memray ได้ เมื่อติดตั้งแล้ว ปลั๊กอิน pytest นี้ให้คุณเพิ่ม --memray
ลงในการเรียกใช้บรรทัดคำสั่ง:
pytest --memray tests/
และจะได้รับรายงานอัตโนมัติดังนี้:
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
คุณยังสามารถใช้เครื่องหมายบางตัวที่ให้มาเพื่อทำให้การทดสอบล้มเหลว หากการดำเนินการทดสอบดังกล่าวจัดสรรหน่วยความจำมากกว่าที่อนุญาต:
@ pytest . mark . limit_memory ( "24 MB" )
def test_foobar ():
# do some stuff that allocates memory
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการใช้และกำหนดค่าปลั๊กอิน โปรดดูเอกสารประกอบของปลั๊กอิน
Memray รองรับการติดตามฟังก์ชัน C/C++ ดั้งเดิม รวมถึงฟังก์ชัน Python สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อสร้างโปรไฟล์แอปพลิเคชันที่มีส่วนขยาย C (เช่น numpy
หรือ pandas
) เนื่องจากจะทำให้เห็นภาพแบบองค์รวมว่าส่วนขยายจะจัดสรรหน่วยความจำเป็นจำนวนเท่าใด และ Python เองจะจัดสรรหน่วยความจำเป็นจำนวนเท่าใด
หากต้องการเปิดใช้งานการติดตามแบบเนทิฟ คุณต้องระบุอาร์กิวเมนต์ --native
เมื่อใช้คำสั่งย่อย run
:
memray run --native my_script.py
สิ่งนี้จะเพิ่มข้อมูลดั้งเดิมลงในไฟล์ผลลัพธ์โดยอัตโนมัติ และผู้รายงานใดๆ ก็ตามจะใช้ข้อมูลนั้นโดยอัตโนมัติ (เช่น กราฟฟลากราฟ หรือผู้รายงานตาราง) ซึ่งหมายความว่าแทนที่จะเห็นสิ่งนี้ในกราฟเปลวไฟ:
ตอนนี้คุณจะสามารถเห็นสิ่งที่เกิดขึ้นภายในการโทรของ Python:
ผู้รายงานแสดงเฟรมดั้งเดิมด้วยสีที่แตกต่างจากเฟรม Python นอกจากนี้ยังสามารถแยกแยะความแตกต่างได้ด้วยการดูตำแหน่งไฟล์ในเฟรม (โดยทั่วไปเฟรม Python จะถูกสร้างขึ้นจากไฟล์ที่มีนามสกุล .py ในขณะที่เฟรมดั้งเดิมจะถูกสร้างขึ้นจากไฟล์ที่มีนามสกุล เช่น .c, .cpp หรือ .h)
โหมดสดของ Memray รันสคริปต์หรือโมดูลในอินเทอร์เฟซที่ใช้เทอร์มินัลซึ่งช่วยให้คุณสามารถตรวจสอบการใช้งานหน่วยความจำแบบโต้ตอบได้ในขณะที่ทำงาน สิ่งนี้มีประโยชน์สำหรับการดีบักสคริปต์หรือโมดูลที่ใช้เวลานานในการรันหรือมีรูปแบบหน่วยความจำที่ซับซ้อนหลายรูปแบบ คุณสามารถใช้ตัวเลือก --live
เพื่อรันสคริปต์หรือโมดูลในโหมดสด:
memray run --live my_script.py
หรือถ้าคุณต้องการรันโมดูล:
memray run --live -m my_module
นี่จะแสดงอินเทอร์เฟซ TUI ต่อไปนี้ในเทอร์มินัลของคุณ:
ผลลัพธ์จะแสดงตามลำดับจากมากไปหาน้อยของหน่วยความจำทั้งหมดที่จัดสรรโดยฟังก์ชันและฟังก์ชันย่อยที่เรียกใช้โดยฟังก์ชันนั้น คุณสามารถเปลี่ยนลำดับได้โดยใช้แป้นพิมพ์ลัดต่อไปนี้:
t (ค่าเริ่มต้น): จัดเรียงตามหน่วยความจำทั้งหมด
o: จัดเรียงตามหน่วยความจำของตัวเอง
a: จัดเรียงตามจำนวนการจัดสรร
ในเทอร์มินัลส่วนใหญ่ คุณสามารถคลิกปุ่ม "จัดเรียงตามผลรวม" "จัดเรียงตามของตัวเอง" และ "จัดเรียงตามการจัดสรร" ที่ส่วนท้ายได้
ส่วนหัวของคอลัมน์ที่เรียงลำดับจะถูกขีดเส้นใต้
ตามค่าเริ่มต้น คำสั่ง live จะแสดงเธรดหลักของโปรแกรม คุณสามารถดูเธรดต่างๆ ของโปรแกรมได้โดยการกดปุ่มมากกว่าและน้อยกว่า <
และ >
ในเทอร์มินัลส่วนใหญ่ คุณสามารถคลิกปุ่ม "กระทู้ก่อนหน้า" และ "หัวข้อถัดไป" ที่ส่วนท้ายได้
นอกเหนือจากการติดตามกระบวนการ Python จาก CLI โดยใช้ memray run
แล้ว ยังสามารถเปิดใช้งานการติดตามภายในโปรแกรม Python ที่ทำงานอยู่โดยทางโปรแกรมได้อีกด้วย
import memray
with memray . Tracker ( "output_file.bin" ):
print ( "Allocations will be tracked until the with block ends" )
สำหรับรายละเอียด โปรดดูเอกสารประกอบ API
Memray ได้รับอนุญาตจาก Apache-2.0 ดังที่พบในไฟล์ LICENSE
โครงการนี้ได้นำหลักจรรยาบรรณมาใช้ หากคุณมีข้อกังวลเกี่ยวกับหลักจรรยาบรรณหรือพฤติกรรมที่คุณพบในโครงการ โปรดติดต่อเราที่ [email protected]
หากคุณเชื่อว่าคุณได้ระบุช่องโหว่ด้านความปลอดภัยในโครงการนี้แล้ว โปรดส่งอีเมลไปที่ทีมงานโครงการที่ [email protected] โดยให้รายละเอียดเกี่ยวกับปัญหาที่น่าสงสัยและวิธีการใดๆ ที่คุณพบในการทำซ้ำ
โปรดอย่าเปิดปัญหาในพื้นที่เก็บข้อมูล GitHub เนื่องจากเราต้องการเก็บรายงานช่องโหว่ไว้เป็นส่วนตัวจนกว่าเราจะมีโอกาสตรวจสอบและแก้ไขปัญหาเหล่านั้น
เรายินดีรับการมีส่วนร่วมของคุณเพื่อช่วยเราปรับปรุงและขยายโครงการนี้!
ด้านล่างนี้คุณจะพบขั้นตอนพื้นฐานที่จำเป็นเพื่อให้สามารถมีส่วนร่วมในโครงการได้ หากคุณมีคำถามใดๆ เกี่ยวกับกระบวนการนี้หรือแง่มุมอื่นใดของการมีส่วนร่วมในโครงการโอเพ่นซอร์สของ Bloomberg โปรดส่งอีเมลไปที่ [email protected] แล้วเราจะตอบคำถามของคุณโดยเร็วที่สุด
เนื่องจากโปรเจ็กต์นี้เผยแพร่ภายใต้เงื่อนไขของใบอนุญาตโอเพ่นซอร์ส การสนับสนุนที่คุณทำจึงได้รับอนุญาตภายใต้ข้อกำหนดเดียวกัน เพื่อให้เราสามารถยอมรับการมีส่วนร่วมของคุณได้ เราจะต้องได้รับการยืนยันอย่างชัดแจ้งจากคุณว่าคุณสามารถและเต็มใจที่จะมอบให้ภายใต้ข้อกำหนดเหล่านี้ และกลไกที่เราใช้ในการดำเนินการนี้เรียกว่าใบรับรองแหล่งกำเนิดสินค้าของนักพัฒนา (DCO) . สิ่งนี้คล้ายกับกระบวนการที่ใช้โดยเคอร์เนล Linux, Samba และโปรเจ็กต์โอเพ่นซอร์สสำคัญอื่นๆ มาก
หากต้องการเข้าร่วมภายใต้ข้อกำหนดเหล่านี้ สิ่งที่คุณต้องทำคือใส่บรรทัดต่อไปนี้เป็นบรรทัดสุดท้ายของข้อความคอมมิตสำหรับแต่ละคอมมิตในการบริจาคของคุณ:
Signed-Off-By: Random J. Developer <[email protected]>
วิธีที่ง่ายที่สุดในการบรรลุเป้าหมายนี้คือการเพิ่ม -s
หรือ --signoff
ให้กับคำสั่ง git commit
ของคุณ
คุณต้องใช้ชื่อจริงของคุณ (ขออภัย ห้ามใช้นามแฝง และไม่เปิดเผยชื่อ)