خداحافظ pandas، از Terality استفاده کنید.

دوقلو شیطانی با سینتکسی مشابه اما تا 30 برابر سریعتر...

مانند همه چیز، هنگام کار با داده‌های بزرگ، ما از اینکه چه پکیجی را انتخاب کنیم رنج می‌بریم. ابزار شماره یکی که به ذهن ما می رسد پانداس(pandas) است، پس از آن ابزارهایی مانند Dask, Vaex, Datatable, cuDF . اکنون باید ترالیتی(Terality) را به این لیست اضافه کنیم.

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

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


ترالیتی چیست و چگونه کار می کند؟

ترالیتی یک موتور پردازش داده بدون سرور است که روی دسته‌های غول پیکر اجرا می شود. شما می‌توانید با دیتاستی با هر اندازه عظیمی کار کنید، به سرعت و بدون نگرانی در مورد اندازه منابع روی دسته‌ها یا زیرساخت‌ها.

این یعنی:

1. عملاً هیچ محدودیتی در حافظه وجود ندارد، بنابراین در اندازه دیتاست محدودیتی وجود ندارد.

2. برای پردازش صدها گیگابایت، حتی در یک دستگاه رم 4 گیگابایتی، فقط به یک اتصال اینترنت خوب نیاز دارید.

و مزیت اصلی ترالیتی این است که پکیج پایتون آن همان دستور پانداس را دارد.شما فقط باید یک خط کد را تغییر دهید تا از پانداس به ترالیتی سوییچ کنید.

وقتی که شما توابع پانداس را فراخوانی می‌کنید، پکیج Python درخواست‌های HTTPS را به موتور ترالیتی ارسال می‌کند. موتور، داده‌ها و دستورات را پردازش می‌کند و نتیجه را پس می‌فرستد.

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


آماده کردن دیتاست:

پانداس در ژانویه 2008 معرفی شد، زمانی که بچه دیتاست های امروزی تنها چیزی بود که دانشمندان داده باید نگران آن می‌بودند.

اکنون، مردم باید با دیتاست‌های عظیمی دست و پنجه نرم کنند و متوجه می‌شوند که پانداس توانایی مدیریت چنین دیتاست‌هایی را ندارد. ترالیتی اینجاست تا این مشکل پایه را حل کند.

به عنوان مثال، ما یک دیتاست ساده (دیتاست Kaggle TPS مه 2021) می گیریم و از آن نمونه برداری می کنیم تا 60 میلیون ردیف و 18 ستون داشته باشد.

import pandas as pd       
df = pd.read_csv(&quotdata/train.csv&quot)       
large_df = df.sample(6 * 10 ** 7, replace=True)  # 60 million rows       
large_df.to_parquet(    &quotdata/tps_may_large.parquet&quot, row_group_size=len(df) // 15, engine=&quotpyarrow&quot   )

ما داده‌ها را با فرمت Parquet ذخیره می کنیم زیرا نوشتن آن در CSV تا حد احمقانه ای بسیار خوش بینانه است. فایل حدوداً 7 گیگابایت خواهد بود که با استانداردهای امروزی هنوز بسیار کوچک است:

from pathlib import Path
size = Path(&quotdata/tps_may_large.parquet&quot).stat().st_size   
size_in_gb = size / 1024 ** 3      
 >>> round(size_in_gb, 2)   7.1

پانداس در مقابل ترالیتی: بارگیری داده:

مقایسه سرعت را با بارگذاری فایل Parquet در فضای کاری خود شروع خواهیم کرد.

عملکرد پانداس به شدت به CPU دستگاه شما بستگی دارد. دستگاه من AMD Ryzen 9 3900X با 12 هسته است - یک پردازنده بسیار پیشرفته که سریعتر از CPU های رایگان سرورهای Google Colab یا Kaggle است. بنابراین، می توان انتظار داشت که دستگاه من مبارزه خوبی با سرورهای مجازی ترالیتی داشته باشد.

import pandas as pd       
%%time       
df = pd.read_parquet(&quotdata/tps_may_large.parquet&quot)

من داده‌ها را از حافظه محلی با پانداس خواندم.

در ترالیتی، من داده ها را از یک بسته Amazon S3 خواندم:

import terality as te       
%%time       
df_te = te.read_parquet(&quots3://sample-bucket-for-medium/tps_may_large.parquet&quot)

حتی اگر بتوانید با فایل‌های محلی کار کنید، ترالیتی با فایل‌های Amazon S3 یا Google Cloud بهترین کار را می‌کند.

همانطور که قبلاً اشاره کردم، سرعت ترالیتی به سرعت اینترنت شما بستگی دارد، نه قدرت CPU. خواندن فایل Parquet از روی حافظه به معنای ارسال 7 گیگابایت داده به موتور است که ایده آل نیست.

سرعت اینترنت در کشور ما ضعیف است، بنابراین تکلیف S3 مشخص است. در اینجا نتایج آمده است:

در حال حاضر، ترالیتی کمی عقب است، که دلیل آن عمدتاً سرعت اینترنت و قدرت CPU من است. بیایید سایر عملیات سنگین محاسباتی رایج را برای مقایسه بیشتر انجام دهیم.


عملیات‌های متداول پانداس:

قبل از اینکه نتایج محلی خود را نشان دهم، بیایید به نحوه عملکرد ترالیتی در برابر پانداس و جایگزین های قدرتمند آن در معیار شناخته شده h2o با استفاده از یک دیتاست 50 گیگابایتی نگاه کنیم.

در اینجا نتیجه یک عملیات groupby پیشرفته را مشاهده می کنید:

همانطور که می‌بینید، فقط ترالیتی می‌تواند درست کار کند در حالی که دیگر پکیج‌ها درست کار نمی‌کنند و خطاهای ناخوشایند حافظه را نشان می‌دهند. همین امر برای عملیات پیوستن (join) نیز صادق است:


البته، همه، دستگاه‌های 128 گیگابایتی لوکس را ندارند، بنابراین من فقط آزمایش‌ها را روی دستگاه ساده 32 گیگابایتی خود نشان می‌دهم:

گروه‌بندی (Grouping):

%%time       
df.groupby(&quotcat2&quot).mean()


مرتب‌سازی (Sorting):

%%time       
df.sort_values(by=&quotcont5&quot, ascending=False)


ایجاد یک ستون جدید:

%%time  df[&quotnew&quot] = df[&quotcont0&quot].apply(lambda x: np.sqrt(np.exp(x)))   
df[&quotnew&quot].sample(5)           
145053 1.40283   
286303 1.27540   
103920 1.16384   
85100 1.29126   
216857 1.17710   
Name: new, dtype: float64


جایگزین کردن (Replacing):

%%time       
df.replace([&quotA&quot, &quotB&quot, &quotC&quot], [&quotAA&quot, &quotBB&quot, &quotCC&quot], inplace=True)

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


هشدارها و قیمت گذاری:

اگرچه ترالیتی دارای سینتکس یکسانی است، اما برخی از توابع پانداس هنوز پیاده سازی نشده اند.

شما می توانید انتظار داشته باشید که حدود 80 تا 90 درصد از تمام متدهای DataFrames و Series روی ساختار داده ترالیتی نیز کار کنند. بیشتر توابع موجود در فضای پانداس (آنهایی که با pd.some_function نامیده می شوند) نیز کار می‌کنند. با توجه به اینکه ترالیتی هنوز در مرحله بتا است، این کار کوچکی نیست.

شاید قبلاً آن را حدس زده باشید، اما ترالیتی یک نرم افزار فریمیوم است. یعنی طرح رایگان به شما 200 گیگابایت پهنای باند می‌دهد، اما باید برای هر چیز بزرگتری هزینه کنید.

دیتاست های امروزی حدود 68 گیگابایت حافظه عمیق(deep memory) اشغال می‌کند. (به df.info(memory_usage='deep') مراجعه کنید)، بنابراین طرح رایگان من را خیلی سریع مصرف کرد. با این حال، تیم ترالیتی به اندازه کافی مهربان بود که طرح من را ارتقا داد و من را قادر ساخت تا آزمایشات این مقاله را به پایان برسانم.

پس از نوشتن این مقاله، ترالیتی برنامه های قیمت گذاری خود را که در تصویر نشان داده شده است، به روز کرد.

نتیجه‌گیری:

بله، ترالیتی عالی است – هیچ ابزار دیگری وجود ندارد که شباهت آن به پانداس را داشته باشد. موتور بدون محدودیت حافظه آن بسیار عالی است.

اما ترالیتی چیزی نیست که بتوانید در اوقات فراغت خود آن را به آتش بکشید و بعد آن را سر هم بندی کنید. طرح 200 گیگابایتی آنقدرها هم که فکر می‌کنید سخاوتمندانه به نظر نمی‌رسد زیرا هر فراخوانی API مهم است، نه فقط خواندن داده‌ها.

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

ترالیتی باید یکی از انتخاب‌های برتر باشد زیرا سریع‌ترین و ساده‌ترین انتخاب است و عملاً هیچ منحنی یادگیری ندارد.