خانه / آموزش‌ها / آموزش جامع ماژول mmap در پایتون (مدیریت فایل در حافظه)

آموزش جامع ماژول mmap در پایتون (مدیریت فایل در حافظه)

🐍 HomeOfPython
|
📅 1404/10/18

سطح مقدماتی (Beginner Level)

ماژول mmap در پایتون به شما اجازه می‌دهد تا یک فایل (یا بخشی از آن) را مستقیماً به حافظه (RAM) نگاشت (Map) کنید. این کار باعث می‌شود فایل دقیقاً مانند یک شیء bytearray یا یک رشته‌ی قابل تغییر (mutable string) رفتار کند.

استفاده از mmap دو مزیت اصلی دارد:

  1. سرعت: سیستم‌عامل مدیریت حافظه مجازی را به عهده می‌گیرد و نیاز به کپی کردن مداوم داده‌ها بین بافر فایل و حافظه برنامه را کاهش می‌دهد.
  2. دسترسی تصادفی (Random Access): می‌توانید به هر بایت از فایل بدون نیاز به خواندن کل فایل دسترسی داشته باشید.

اصول اولیه و پیش‌نیازها

برای استفاده از mmap، ابتدا باید یک فایل را با استفاده از تابع استاندارد open() باز کنید. نکته مهم این است که فایل باید حتماً به صورت باینری (b) باز شود. همچنین برای تغییر فایل، باید دسترسی نوشتن یا به‌روزرسانی (r+ یا w+) داشته باشید.

سینتکس کلی

python
import mmap

# 1. Open file
# 2. Get file descriptor (fileno)
# 3. Create mmap object

خواندن از فایل با mmap

در این روش، فایل را باز می‌کنیم و محتویات آن را مانند یک رشته می‌خوانیم. می‌توانیم از Slicing (برش) پایتون استفاده کنیم.

مثال ۱: خواندن بخشی از فایل (Interactive)

در این مثال یک فایل متنی ایجاد کرده و سپس ۵ کاراکتر اول آن را با mmap می‌خوانیم.

Python

نوشتن و تغییر فایل با mmap

چون شیء mmap رفتار mutable دارد، می‌توانیم کاراکترهای خاصی را در فایل تغییر دهیم بدون اینکه نیاز باشد کل فایل را دوباره بازنویسی کنیم.

مثال ۲: تغییر یک کاراکتر خاص (Interactive)

توجه کنید که داده‌ها باید به صورت bytes باشند.

Python

مثال ۳: تعریف تابع بدون اجرا (Static)

این کد نشان می‌دهد چگونه می‌توان تابعی نوشت که فقط فایل‌های بزرگ را پردازش کند، اما چون فایل خارجی نیاز دارد، اینجا اجرا نمی‌شود.

python
import mmap

def process_large_file(filepath):
    """
    این تابع فقط برای نمایش ساختار است و اجرا نمی‌شود.
    """
    with open(filepath, "r+b") as f:
        with mmap.mmap(f.fileno(), 0) as mm:
            if mm.find(b"ERROR") != -1:
                print("Error found in log file.")

سطح پیشرفته (Professional Level)

در سطح حرفه‌ای، mmap ابزاری قدرتمند برای بهینه‌سازی Performance در برنامه‌هایی است که با فایل‌های چند گیگابایتی کار می‌کنند. همچنین درک حالت‌های دسترسی (Access Modes) و نشانگرهای فایل (Cursors) حیاتی است.

حالت‌های دسترسی (Access Modes)

هنگام ساخت شیء mmap، پارامتر access یا flags رفتار حافظه را تعیین می‌کند:

  1. ACCESS_READ: فقط خواندنی (تلاش برای نوشتن خطا می‌دهد).
  2. ACCESS_WRITE: نوشتن مستقیم روی حافظه و دیسک (Write-through).
  3. ACCESS_COPY: تغییرات فقط در حافظه اعمال می‌شوند و فایل اصلی دست‌نخورده باقی می‌ماند (Copy-on-Write).

جستجو و جابجایی نشانگر (Seek & Tell)

شیء mmap متدهای فایل-محور مثل seek() (جابجایی مکان‌نما)، tell() (موقعیت فعلی) و find() (جستجو) را دارد. این بسیار سریع‌تر از خواندن خط به خط فایل در پایتون است.

مثال ۱: استفاده از seek و find (Interactive)

در این مثال، کلمه خاصی را در فایل پیدا کرده و مکان‌نما را جابجا می‌کنیم تا داده‌های بعد از آن را بخوانیم.

Python

استفاده از Regular Expressions با mmap

ماژول re در پایتون مستقیماً از اشیاء mmap پشتیبانی می‌کند. این ویژگی برای جستجوی پترن‌های پیچیده در فایل‌های لاگ (Log Files) حجیم بدون لود کردن آن‌ها در رم فوق‌العاده است.

مثال ۲: جستجوی پترن با Regex (Interactive)

Python

نکات فنی و Performance

  1. Size Limit: در سیستم‌های ۳۲ بیتی، mmap محدود به فضای آدرس‌دهی (معمولاً ۲ تا ۴ گیگابایت) است. در سیستم‌های ۶۴ بیتی، می‌توانید فایل‌های ترابایتی را نگاشت کنید.
  2. Context Manager: همیشه از with استفاده کنید تا mmap به درستی بسته شود. باز ماندن آن می‌تواند منجر به Resource Leak شود.
  3. Resizing: در برخی سیستم‌عامل‌ها (مثل ویندوز و لینوکس با شرایط خاص)، می‌توانید سایز mmap را با mm.resize(new_size) تغییر دهید، اما این کار پرریسک است و به پشتیبانی سیستم‌عامل بستگی دارد.

مثال ۳: Copy-on-Write (تغییر امن) (Interactive)

این مثال نشان می‌دهد چگونه با ACCESS_COPY تغییرات را در حافظه اعمال کنیم بدون اینکه فایل اصلی خراب شود.

Python