بهینه‌سازی استفاده از حافظه Pandas برای مجموعه داده‌های بزرگ

شکل۱. مجموعه داده‌های بزرگ
شکل۱. مجموعه داده‌های بزرگ
منتشر‌شده در : towardsdatascience به تاریخ ۲ ژوئن ۲۰۲۱
لینک منبع Optimize Pandas memory usage for large datasets

پانداس یک بسته پایتون محبوب برای علم داده است، زیرا ساختارهای داده قدرتمند، رسا و انعطاف‌پذیر را برای کاوش داده و تصویرسازی ارائه می‌دهد. اما زمانی که بحث مدیریت مجموعه داده‌های بزرگ مطرح می‌شود، با شکست مواجه می‌شود، چرا که نمی‌تواند داده‌های بزرگ‌تر از حافظه را پردازش کند.

پانداس یک لیست گسترده از API را برای کاوش داده‌ها و تصویرسازی ارائه می‌دهد، که آن را در میان جامعه دانشمندان داده محبوب‌تر می‌کند. Dask، modin، Vaex برخی از بسته‌های متن باز هستند که می‌توانند عملکرد کتابخانهPandas را افزایش دهند و مجموعه داده‌های بزرگ را مدیریت کنند.

هنگامی که اندازه مجموعه داده نسبتا بزرگ‌تر از حافظه با استفاده از چنین کتابخانه‌هایی است، اما زمانی که اندازه مجموعه داده نسبتا برابر یا کوچک‌تر از اندازه حافظه باشد، می‌توانیم استفاده از حافظه را به هنگام خواندن مجموعه داده بهینه کنیم. در این مقاله، در مورد چگونگی بهینه‌سازی استفاده از حافظه در حین بارگذاری مجموعه داده‌ها با استفاده از توابع pandas.read_excel() ،pandas.read_csv() یا pandas.read_excel() بحث خواهیم کرد.

ایده:

نوع داده یک ساختار داخلی است که پایتون از آن برای درک نحوه ذخیره و دستکاری داده استفاده می‌کند. با خواندن مجموعه داده‌ها با استفاده از تابع Pandas read_، انواع داده‌های پیش‌فرض به هر ستون ویژگی اختصاص داده می‌شوند. با مشاهده مقادیر ویژگی Pandas نوع داده را تعیین می‌کند و آن را در RAM بارگذاری می‌کند.

برای مقادیر صحیحPandas، مقادیر شناور را به صورت float64 در نظر می‌گیرند، مقادیر رشته به عنوان اشیا در نظر گرفته می‌شوند. ایده کاهش نوع داده ویژگی با مشاهده حداکثر و حداقل مقدار ویژگی است. فهرست پیش‌فرض انواع داده‌های تخصیص‌داده‌شده توسط Pandas عبارتند از:

شکل ۲: نوع داده پیش‌فرضPandas
شکل ۲: نوع داده پیش‌فرضPandas

یک مقدار با نوع داده مانند int8 در مقایسه با نوع داده int64 هشت برابر حافظه کمتری می‌گیرد.

لیست زیر را دنبال کنید تا محدوده‌های هر نوع داده را به دست آورید:

شکل 3: انواع داده‌ها و محدوده آن‌ها
شکل 3: انواع داده‌ها و محدوده آن‌ها

داده‌ها:

ما از مجموعه داده مدت سفر نیویورک تاکسی از کاگل برای نشان دادن بیشتر استفاده خواهیم کرد. با خواندن داده‌ها با Pandas، آن را به میزان ۴۶۷ MB اشغال می‌کند. با استفاده از تابع .info() می‌توان انواع داده‌های پیش‌فرض و استفاده از حافظه را مشاهده کرد.

شکل 4:  انواع داده‌های پیش‌فرض اختصاص‌داده‌شده و استفاده از حافظه
شکل 4: انواع داده‌های پیش‌فرض اختصاص‌داده‌شده و استفاده از حافظه

ویژگی‌های عددی:

برای همه مقادیر عددیPandas ، نوع دادهfloat64 را به یک ستون ویژگی دارای حداقل یک مقدارfloat و نوع داده int64 را به یک ستون ویژگی با تمام مقادیر ویژگی به عنوان عدد اختصاص می‌دهد.

اعداد صحیح:

در مجموعه داده سفر تاکسی نیویورک، ستون‌های passenger_count ،vendor_id ،trip_duration به صورت پیش‌فرض به عنوان نوع دادهint64 تعیین می‌شوند.

با مشاهده حداقل و حداکثر مقدار برای ویژگی‌های passenger_count ،vendor_id، می‌توان آن را در نوع داده int8 تنظیم کرد و trip_duration را می توان در نوع دادهint32 تنظیم کرد.

استفاده از حافظه توسط ویژگی‌های vendor_id، passenger_count با نوع دادهint64 هر کدام ۱۱،۶۶۹،۱۵۲ بایت هستند، که تا ۸۸٪ به ۱،۴۵۸،۶۴۴ بایت کاهش می‌یابد.

استفاده از حافظه توسط trip_duration با نوع دادهint64، ۱۱،۶۶۹،۱۵۲ بایت است، که تا ۵۰٪ به ۵،۸۳۴،۵۷۶ بایت کاهش می‌یابد.

کف:

در مجموعه داده نمونه‌برداری تاکسی نیویورک، ستون‌های pickup_longitude , pickup_latitude , dropoff_longitude , dropoff_latitude به صورت پیش‌فرض به عنوان نوع داده فلوات ۶۴ در نظر گرفته می‌شوند.

از مشاهده حداقل و حداکثر مقدار برای ویژگی‌های بالا می‌توانیم نوع داده را از float64 به float16 تنزل دهیم.

استفاده از حافظه توسط ویژگی‌های بالا با نوع داده فلوات ۶۴، ۱۱،۶۶۹،۱۵۲ بایت است، که تا ۷۵٪ به ۲،۹۱۷،۲۸۸ بایت کاهش می‌یابد.

زمان مصرف:

ستون‌های pickup_datetime , dropoff_datetime به صورت پیش‌فرض به عنوان انواع داده‌های شی تخصیص داده می‌شوند که می‌توانند به فرمتDateTime کاهش یابند.

استفاده از حافظه توسط ویژگی‌های بالا با نوع داده object در هر کدام ۱۱۰،۸۵۶،۹۴۴ بایت است، که ۹۰٪ تا ۱۱،۶۶۹،۱۵۲ بایت کاهش می‌یابد.

دسته بندی:

پانداس ستون‌های ویژگی غیر عددی را به عنوان انواع داده‌های object که می‌توانند به انواع داده‌های دسته تنزل درجه یابند، اختصاص می‌دهد. معمولاً ستون ویژگی غیر عددی دارای متغیرهای طبقه‌ای است که بیشتر در حال تکرار هستند. به عنوان مثال، ستون ویژگی جنسیتی تنها ۲ دسته «مرد» و «زن» دارد که بارها و بارها برای تمام مواردی که در حال اشغال مجدد فضا هستند، تکرار می‌شوند. تخصیص آن به نوع داده دسته یک نمایش نسبتا فشرده است.

استفاده از حافظه توسط ویژگی store_and_fwd_flag با نوع داده شی ۹۰،۴۳۵،۹۲۸ بایت است، که تا حدود ۹۸٪ به ۱،۴۵۸،۸۴۸ بایت کاهش می‌یابد.

هنگامی که تعداد دسته‌های منحصر به فرد برای هر ویژگی طبقه‌بندی نسبتا کم‌تر از تعداد نمونه‌های مجموعه داده است، پس باید آن را به نوع داده دسته نشان داد.

مرتب کردن در حین خواندن داده‌ها:

عبارت pandas.read_csv با یک پارامتر type می‌آید که انواع داده فراهم‌شده توسط کاربر را در یک فرمت مقدار کلیدی می‌پذیرد که می‌تواند به جای نوع پیش‌فرض استفاده کند. ستون مشخصه DateTime را می‌توان به پارامتر parse_dates انتقال داد.

خواندن همان مجموعه داده دوره سفر نیویورک با استفاده از انواع داده‌های پیش‌فرض مورد استفاده ۴۲۷ MB حافظه. پس از مشخص‌سازی، استفاده از حافظه تا ۷۰٪ به ۱۳۵ MB کاهش می‌یابد.

نتیجه‌گیری:

تکنیک نمونه‌سازی بحث شده در این مقاله می‌تواند استفاده از حافظه داده‌ها با تابع خواندن پاندا را تا حدودی کاهش دهد. اگر اندازه مجموعه داده در مقایسه با RAM بسیار بزرگ باشد، بهینه‌سازی نوع داده ممکن است کمکی نکند. برای چنین اندازه بزرگی، مجموعه داده باید متوازی‌سازی کتابخانه‌هایی مانندDask، Vaex، Modin را امتحان کند.

از شما برای خواندن متشکرم

این متن با استفاده از ربات مترجم مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.