Python میں متوازی پروسیسنگ بڑی فائل

Python میں متوازی پروسیسنگ بڑی فائل

ماخذ نوڈ: 1970104

Python میں متوازی پروسیسنگ بڑی فائل
مصنف کی طرف سے تصویر
 

متوازی پروسیسنگ کے لیے، ہم اپنے کام کو ذیلی اکائیوں میں تقسیم کرتے ہیں۔ یہ پروگرام کے ذریعہ پروسیس شدہ ملازمتوں کی تعداد کو بڑھاتا ہے اور مجموعی پروسیسنگ وقت کو کم کرتا ہے۔ 

مثال کے طور پر، اگر آپ ایک بڑی CSV فائل کے ساتھ کام کر رہے ہیں اور آپ ایک کالم میں ترمیم کرنا چاہتے ہیں۔ ہم ڈیٹا کو فنکشن کے لیے ایک صف کے طور پر فیڈ کریں گے، اور یہ دستیاب کی تعداد کی بنیاد پر ایک ساتھ متعدد اقدار کو متوازی پروسیس کرے گا۔  کارکنوں. یہ کارکنان آپ کے پروسیسر کے اندر کور کی تعداد پر مبنی ہیں۔ 
 

نوٹ: چھوٹے ڈیٹاسیٹ پر متوازی پروسیسنگ کا استعمال پروسیسنگ کے وقت کو بہتر نہیں کرے گا۔

 

اس بلاگ میں، ہم سیکھیں گے کہ بڑی فائلوں پر پروسیسنگ کا وقت کیسے کم کیا جائے۔ ملٹی پروسیسنگ, نوکری، اور tqdm ازگر پیکجز۔ یہ ایک سادہ ٹیوٹوریل ہے جو کسی بھی فائل، ڈیٹا بیس، امیج، ویڈیو اور آڈیو پر لاگو ہو سکتا ہے۔ 
 

نوٹ: ہم تجربات کے لیے Kaggle نوٹ بک استعمال کر رہے ہیں۔ پروسیسنگ کا وقت مشین سے مشین میں مختلف ہوسکتا ہے۔  

 

ہم استعمال کریں گے امریکی حادثات (2016 – 2021) Kaggle سے ڈیٹا سیٹ جو 2.8 ملین ریکارڈز اور 47 کالموں پر مشتمل ہے۔ 

ہم درآمد کریں گے۔ multiprocessing, joblib، اور tqdm لیے متوازی پروسیسنگ, pandas لیے ڈیٹا کے ادخال، اور re, nltk، اور string لیے ٹیکسٹ پروسیسنگ

# متوازی کمپیوٹنگ
درآمد ملٹی پروسیسنگ as mp
سے نوکری درآمد متوازی، تاخیر سے
سے tqdm.notebook درآمد tqdm # ڈیٹا کی کھپت 
درآمد pandas as pd # ٹیکسٹ پروسیسنگ 
درآمد re سے nltk.corpus درآمد سٹاپ ورڈز
درآمد سٹرنگ

اس سے پہلے کہ ہم سیدھے اندر جائیں، آئیے سیٹ کریں۔ n_workers دوگنا کر کے cpu_count(). جیسا کہ آپ دیکھ سکتے ہیں، ہمارے پاس 8 کارکن ہیں۔

n_workers = 2 * mp.cpu_count() print(f"{n_workers} workers are available") >>> 8 کارکن دستیاب ہیں۔

اگلے مرحلے میں، ہم استعمال کرتے ہوئے بڑی CSV فائلوں کو ہضم کریں گے۔ pandas read_csv فنکشن پھر، ڈیٹا فریم کی شکل، کالموں کا نام، اور پروسیسنگ کا وقت پرنٹ کریں۔ 

نوٹ: Jupyter’s magic function %%time ظاہر کر سکتا ہے CPU اوقات اور دیوار کا وقت عمل کے اختتام پر. 

 

%%time
file_name="../input/us-accidents/US_Accidents_Dec21_updated.csv"
df = pd.read_csv(file_name) print(f"Shape:{df.shape}nnColumn Names:n{df.columns}n")

آؤٹ پٹ

Shape:(2845342, 47) Column Names: Index(['ID', 'Severity', 'Start_Time', 'End_Time', 'Start_Lat', 'Start_Lng', 'End_Lat', 'End_Lng', 'Distance(mi)', 'Description', 'Number', 'Street', 'Side', 'City', 'County', 'State', 'Zipcode', 'Country', 'Timezone', 'Airport_Code', 'Weather_Timestamp', 'Temperature(F)', 'Wind_Chill(F)', 'Humidity(%)', 'Pressure(in)', 'Visibility(mi)', 'Wind_Direction', 'Wind_Speed(mph)', 'Precipitation(in)', 'Weather_Condition', 'Amenity', 'Bump', 'Crossing', 'Give_Way', 'Junction', 'No_Exit', 'Railway', 'Roundabout', 'Station', 'Stop', 'Traffic_Calming', 'Traffic_Signal', 'Turning_Loop', 'Sunrise_Sunset', 'Civil_Twilight', 'Nautical_Twilight', 'Astronomical_Twilight'],
dtype='object') CPU times: user 33.9 s, sys: 3.93 s, total: 37.9 s
Wall time: 46.9 s

۔ clean_text متن کی پروسیسنگ اور صفائی کے لیے ایک سیدھا سادا فنکشن ہے۔ ہمیں انگریزی مل جائے گی۔ سٹاپ ورڈز کا استعمال کرتے ہوئے nltk.copus ٹیکسٹ لائن سے سٹاپ الفاظ کو فلٹر کرنے کے لیے اس کا استعمال کریں۔ اس کے بعد، ہم جملے سے خصوصی حروف اور اضافی خالی جگہوں کو ہٹا دیں گے۔ پروسیسنگ کے وقت کا تعین کرنے کے لیے یہ بنیادی فنکشن ہوگا۔ سیریل, متوازی، اور بیچ پروسیسنگ. 

def صاف_متن(متن): # اسٹاپ الفاظ کو ہٹا دیں۔ stops = stopwords.words("english") text = " ".join([word لیے لفظ in text.split() if لفظ نوٹ in رک جاتا ہے]) # خصوصی حروف کو ہٹا دیں۔ text = text.translate(str.maketrans(',', string.punctuation)) # اضافی جگہوں کو ہٹانا text = re.sub(' +',' ', text) واپسی متن

سیریل پروسیسنگ کے لیے، ہم پانڈا استعمال کر سکتے ہیں۔ .apply() فنکشن، لیکن اگر آپ پروگریس بار دیکھنا چاہتے ہیں، تو آپ کو چالو کرنے کی ضرورت ہے۔ tqdm لیے pandas اور پھر استعمال کریں .progress_apply() تقریب. 

ہم 2.8 ملین ریکارڈ پر کارروائی کرنے جا رہے ہیں اور نتیجہ کو واپس "تفصیل" کالم کے کالم میں محفوظ کریں گے۔ 

%%time
tqdm.pandas() df['Description'] = df['Description'].progress_apply(clean_text)

آؤٹ پٹ

اس میں 9 منٹ اور 5 سیکنڈ لگے اعلی کے آخر میں پروسیسر سے سیریل پراسیس 2.8 ملین قطاریں۔ 

100% 2845342/2845342 [09:05<00:00, 5724.25it/s] CPU times: user 8min 14s, sys: 53.6 s, total: 9min 7s
Wall time: 9min 5s

There are various ways to parallel process the file, and we are going to learn about all of them. The multiprocessing is a built-in python package that is commonly used for parallel processing large files. 

ہم ملٹی پروسیسنگ بنائیں گے۔ پول ساتھ 8 کارکنوں اور استعمال کریں نقشہ عمل شروع کرنے کے لیے فنکشن۔ ترقی کی سلاخوں کو ظاہر کرنے کے لیے، ہم استعمال کر رہے ہیں۔ tqdm.

نقشہ کا فنکشن دو حصوں پر مشتمل ہے۔ پہلے کو فنکشن کی ضرورت ہوتی ہے، اور دوسرے کو دلیل یا دلائل کی فہرست کی ضرورت ہوتی ہے۔ 

پڑھ کر مزید جانیں۔ دستاویزات

%%time
p = mp.Pool(n_workers) df['Description'] = p.map(clean_text,tqdm(df['Description']))

آؤٹ پٹ

ہم نے اپنے پروسیسنگ کے وقت کو تقریباً بہتر کیا ہے۔ 3X. پروسیسنگ کا وقت ختم ہو گیا۔ 9 منٹ 5 سیکنڈ کرنے کے لئے 3 منٹ 51 سیکنڈ.   

100% 2845342/2845342 [02:58<00:00, 135646.12it/s] CPU times: user 5.68 s, sys: 1.56 s, total: 7.23 s
Wall time: 3min 51s

اب ہم متوازی پروسیسنگ کرنے کے لیے ایک اور Python پیکج کے بارے میں جانیں گے۔ اس سیکشن میں، ہم joblib کا استعمال کریں گے۔ متوازی اور تاخیر کا شکار کی نقل تیار کرنے کے لئے نقشہ تقریب. 

  • متوازی کو دو دلائل کی ضرورت ہے: n_jobs = 8 اور بیک اینڈ = ملٹی پروسیسنگ۔
  • پھر، ہم شامل کریں گے صاف_متن  کرنے کے لئے تاخیر کا شکار تقریب. 
  • ایک وقت میں ایک ہی قدر کو فیڈ کرنے کے لیے ایک لوپ بنائیں۔ 

ذیل کا عمل کافی عام ہے، اور آپ اپنی ضروریات کے مطابق اپنے فنکشن اور صف میں ترمیم کر سکتے ہیں۔ میں نے اسے بغیر کسی مسئلے کے ہزاروں آڈیو اور ویڈیو فائلوں پر کارروائی کرنے کے لیے استعمال کیا ہے۔ 

سفارش کی جاتی ہے: add exception handling using try: اور except:

def متن_متوازی_صاف(array): result = Parallel(n_jobs=n_workers,backend="multiprocessing")( delayed(clean_text) (text) لیے متن in tqdm(array) ) واپسی نتیجہ

میں "تفصیل" کالم شامل کریں۔ text_parallel_clean()

%%time
df['Description'] = text_parallel_clean(df['Description'])

آؤٹ پٹ

اس میں ہمارے فنکشن کو ملٹی پروسیسنگ سے 13 سیکنڈ زیادہ لگے تالاب۔ پھر بھی، متوازی سے 4 منٹ اور 59 سیکنڈ تیز ہے۔ سیریل پروسیسنگ. 

100% 2845342/2845342 [04:03<00:00, 10514.98it/s] CPU times: user 44.2 s, sys: 2.92 s, total: 47.1 s
Wall time: 4min 4s

بڑی فائلوں کو بیچوں میں تقسیم کرکے اور انہیں متوازی پروسیس کرنے کا ایک بہتر طریقہ ہے۔ آئیے ایک بیچ فنکشن بنا کر شروع کریں جو چلائے گا۔ clean_function اقدار کے ایک بیچ پر۔ 

بیچ پروسیسنگ فنکشن

def proc_batch(بیچ): واپسی [ clean_text(text) لیے متن in batch ]

فائل کو بیچوں میں تقسیم کرنا

ذیل کا فنکشن کارکنوں کی تعداد کی بنیاد پر فائل کو متعدد بیچوں میں تقسیم کرے گا۔ ہمارے معاملے میں، ہمیں 8 بیچ ملتے ہیں۔ 

def بیچ_فائل(array,n_workers): file_len = len(array) batch_size = round(file_len / n_workers) batches = [ array[ix:ix+batch_size] لیے ix in tqdm(range(0, file_len, batch_size)) ] واپسی batches batches = batch_file(df['Description'],n_workers) >>> 100% 8/8 [00:00<00:00, 280.01it/s]

متوازی بیچ پروسیسنگ چل رہا ہے۔

آخر میں، ہم استعمال کریں گے متوازی اور تاخیر کا شکار بیچوں پر کارروائی کرنے کے لیے۔ 

نوٹ: اقدار کی ایک صف حاصل کرنے کے لیے، ہمیں فہرست کی سمجھ کو چلانا ہوگا جیسا کہ ذیل میں دکھایا گیا ہے۔ 

 

%%time
batch_output = Parallel(n_jobs=n_workers,backend="multiprocessing")( delayed(proc_batch) (batch) لیے بیچ in tqdm(batches) ) df['Description'] = [j لیے i in بیچ_آؤٹ پٹ لیے j in i]

آؤٹ پٹ

ہم نے پروسیسنگ کے وقت کو بہتر بنایا ہے۔ یہ تکنیک پیچیدہ ڈیٹا پر کارروائی کرنے اور گہری سیکھنے کے ماڈلز کی تربیت کے لیے مشہور ہے۔ 

100% 8/8 [00:00<00:00, 2.19it/s] CPU times: user 3.39 s, sys: 1.42 s, total: 4.81 s
Wall time: 3min 56s

tqdm ملٹی پروسیسنگ کو اگلی سطح پر لے جاتا ہے۔ یہ سادہ اور طاقتور ہے۔ میں ہر ڈیٹا سائنسدان کو اس کی سفارش کروں گا۔ 

دیکھو دستاویزات ملٹی پروسیسنگ کے بارے میں مزید جاننے کے لیے۔ 

۔ process_map ضرورت ہے:

  1. فنکشن کا نام
  2. ڈیٹا فریم کالم
  3. max_workers
  4. chucksize is similar to batch size. We will calculate the batch size using the number of workers or you can add the number based on your preference. 
%%وقت
سے tqdm.contrib.concurrent درآمد process_map
batch = round(len(df)/n_workers) df["Description"] = process_map( clean_text, df["Description"], max_workers=n_workers, chunksize=batch
)

آؤٹ پٹ

کوڈ کی ایک لائن کے ساتھ، ہمیں بہترین نتیجہ ملتا ہے۔ 

100% 2845342/2845342 [03:48<00:00, 1426320.93it/s] CPU times: user 7.32 s, sys: 1.97 s, total: 9.29 s
Wall time: 3min 51s

آپ کو توازن تلاش کرنے اور اس تکنیک کو منتخب کرنے کی ضرورت ہے جو آپ کے کیس کے لیے بہترین کام کرتی ہے۔ یہ سیریل پروسیسنگ، متوازی، یا بیچ پروسیسنگ ہوسکتی ہے۔ اگر آپ کسی چھوٹے، کم پیچیدہ ڈیٹاسیٹ کے ساتھ کام کر رہے ہیں تو متوازی پروسیسنگ کا اثر ہو سکتا ہے۔ 

اس چھوٹے ٹیوٹوریل میں، ہم نے Python کے مختلف پیکجز اور تکنیکوں کے بارے میں سیکھا ہے جو ہمیں اپنے ڈیٹا فنکشنز کو متوازی پروسیس کرنے کی اجازت دیتے ہیں۔ 

اگر آپ صرف ٹیبلولر ڈیٹاسیٹ کے ساتھ کام کر رہے ہیں اور اپنی پروسیسنگ کی کارکردگی کو بہتر بنانا چاہتے ہیں، تو میں آپ کو کوشش کرنے کا مشورہ دوں گا۔ ڈسک, ڈیٹا ٹیبل، اور ریپڈز 

حوالہ 

 
 
عابد علی اعوان (@1abidaliawan) ایک سرٹیفائیڈ ڈیٹا سائنٹسٹ پروفیشنل ہے جو مشین لرننگ ماڈل بنانا پسند کرتا ہے۔ فی الحال، وہ مشین لرننگ اور ڈیٹا سائنس ٹیکنالوجیز پر مواد کی تخلیق اور تکنیکی بلاگ لکھنے پر توجہ دے رہا ہے۔ عابد کے پاس ٹیکنالوجی مینجمنٹ میں ماسٹر ڈگری اور ٹیلی کمیونیکیشن انجینئرنگ میں بیچلر ڈگری ہے۔ اس کا وژن دماغی بیماری کے ساتھ جدوجہد کرنے والے طلباء کے لیے گراف نیورل نیٹ ورک کا استعمال کرتے ہوئے ایک AI پروڈکٹ بنانا ہے۔
 

ٹائم اسٹیمپ:

سے زیادہ KDnuggets