আমি কোথা থেকে আসছি সে সম্পর্কে সামনে কিছু প্রসঙ্গ। কোড স্নিপেটস শেষ হয়।
যখন আমি পারব, সুপার হাই পারফরম্যান্স সমান্তরাল সিএসভি ফাইল পড়ার জন্য আমি H2O এর মতো একটি ওপেন সোর্স সরঞ্জামটি ব্যবহার করতে পছন্দ করি তবে এই সরঞ্জামটি বৈশিষ্ট্য সংখ্যায় সীমাবদ্ধ। তত্ত্বাবধানে শেখার উপযুক্ততার জন্য H2O ক্লাস্টারে খাওয়ানোর আগে ডেটা সায়েন্স পাইপলাইনগুলি তৈরি করতে আমি প্রচুর কোড লিখে শেষ করি।
আমি ইউসিআই রেপো থেকে 8 গিগাবাইট এইচআইজিজিএস ডেটাসেটের মতো ফাইলগুলি এবং এমনকী 40 গিগাবাইট সিএসভি ফাইল উপাত্ত বিজ্ঞানের উদ্দেশ্যে উল্লেখযোগ্যভাবে দ্রুত পাঠাতে চলেছি যাতে মাল্টিপ্রসেসিং লাইব্রেরির পুল অবজেক্ট এবং মানচিত্রের ক্রিয়াকলাপের সাথে প্রচুর সমান্তরালতা যুক্ত হয়। উদাহরণস্বরূপ নিকটতম প্রতিবেশী অনুসন্ধানগুলির সাথে ক্লাস্টারিং এবং ডিবিএসসিএএন এবং মার্কভ ক্লাস্টারিং অ্যালগরিদমের জন্য কিছু গুরুতর চ্যালেঞ্জিং মেমরি এবং ওয়াল ক্লক সময়ের সমস্যাগুলি বাইপাস করার জন্য কিছু সমান্তরাল প্রোগ্রামিং ফিনেসের প্রয়োজন।
আমি সাধারণত প্রথমে gnu সরঞ্জামগুলি ব্যবহার করে ফাইলটি সারি অনুসারে ভাঙতে চাই এবং তারপরে পাইথন প্রোগ্রামে সমান্তরালে সেগুলি খুঁজে পেতে এবং পড়তে গ্লোব-ফাইলমাস্ক করে ফেলি। আমি সাধারণত 1000+ আংশিক ফাইলের মতো কিছু ব্যবহার করি। এই কৌশলগুলি করা প্রক্রিয়াকরণের গতি এবং মেমরির সীমাতে প্রচুর সহায়তা করে।
পান্ডাস ডেটা ফ্রেম.ড্রেড_সিএসভি একক থ্রেডযুক্ত যাতে আপনি সমান্তরাল সম্পাদনের জন্য একটি মানচিত্র () চালিয়ে পান্ডা তৈরি করতে দ্রুত এই কৌশলগুলি করতে পারেন। আপনি সরল পুরাতন অনুক্রমিক পান্ডাস ডেটা ফ্রেম.ড্রেড_সিএসভি দিয়ে দেখতে এইচটিপি ব্যবহার করতে পারেন, কেবল একটি কোরের 100% সিপিইউ হ'ল পিডি.ড্রেড_সিএসভিতে আসল বাধা, ডিস্কটি মোটেই নয়।
আমার যুক্ত করা উচিত আমি দ্রুত ভিডিও কার্ড বাসে এসএসডি ব্যবহার করছি, এসটিএ 6 বাসে কোনও স্পিনিং এইচডি নয়, 16 সিপিইউ কোর।
এছাড়াও, আমি আবিষ্কার করেছি যে অন্য কৌশলটি কিছু অ্যাপ্লিকেশনগুলিতে দুর্দান্ত কাজ করে তা হ'ল সমান্তরাল সিএসভি ফাইলের পড়া এক বিশাল ফাইলের মধ্যে প্রতিটি কর্মীকে বিভিন্ন অফসেটে শুরু করে, একটি বড় ফাইলকে বহু অংশের ফাইলগুলিতে প্রাক-বিভক্ত করার পরিবর্তে into বড় আকারের টেক্সট স্ট্রিট-বাইট এবং বড় ফাইলের শেষে-বাইট অবস্থানগুলিতে, একই সাথে একই সাথে একই সময়ে, অজগরটির ফাইল সন্ধান করুন () এবং প্রতিটি সমান্তরাল কর্মীর কাছে বলুন () বলুন each আপনি বাইটগুলিতে একটি রেজেক্স ফান্ডল করতে পারেন এবং লাইনফিডগুলির গণনা ফিরিয়ে দিতে পারেন। এটি একটি আংশিক যোগফল। কর্মীরা শেষ হওয়ার পরে মানচিত্রের ফাংশনটি ফিরে আসার পরে বিশ্বব্যাপী যোগফল পাওয়ার জন্য অবশেষে আংশিক যোগফলগুলি যোগ করুন।
সমান্তরাল বাইট অফসেট ট্রিক ব্যবহার করে নীচে কয়েকটি উদাহরণ বেনমার্ক দেওয়া হল:
আমি 2 টি ফাইল ব্যবহার করি: এইচআইজিজিএসসিএসভি 8 জিবি। এটি ইউসিআই মেশিন লার্নিংয়ের সংগ্রহস্থল থেকে এসেছে। all_bin .csv 40.4 গিগাবাইট এবং আমার বর্তমান প্রকল্প থেকে। আমি 2 টি প্রোগ্রাম ব্যবহার করি: জিএনইউ ডাব্লুসি প্রোগ্রাম যা লিনাক্স সহ আসে এবং খাঁটি পাইথন ফাস্ট্রেড.পি প্রোগ্রাম যা আমি বিকাশ করি।
HP-Z820:/mnt/fastssd/fast_file_reader$ ls -l /mnt/fastssd/nzv/HIGGS.csv
-rw-rw-r-- 1 8035497980 Jan 24 16:00 /mnt/fastssd/nzv/HIGGS.csv
HP-Z820:/mnt/fastssd$ ls -l all_bin.csv
-rw-rw-r-- 1 40412077758 Feb 2 09:00 all_bin.csv
ga@ga-HP-Z820:/mnt/fastssd$ time python fastread.py --fileName="all_bin.csv" --numProcesses=32 --balanceFactor=2
2367496
real 0m8.920s
user 1m30.056s
sys 2m38.744s
In [1]: 40412077758. / 8.92
Out[1]: 4530501990.807175
এটি প্রায় 4.5 গিগাবাইট / এস, বা 45 জিবি / গুলি, ফাইল স্লিপিং গতি। এটি কোনও স্পিনিং হার্ড ডিস্ক নয়, আমার বন্ধু। এটি আসলে একটি স্যামসাং প্রো 950 এসএসডি।
নিখুঁত সি সংকলিত প্রোগ্রাম, gnu ডাব্লুসি দ্বারা লাইন গণনা করা একই গতির জন্য নীচের গতি মাপদণ্ড রয়েছে।
কি দুর্দান্ত তা আপনি দেখতে পাচ্ছেন আমার খাঁটি পাইথন প্রোগ্রামটি মূলত এই ক্ষেত্রে gnu wc সংকলিত সি প্রোগ্রামের গতির সাথে মিলেছে। পাইথনকে ব্যাখ্যা করা হলেও সি সংকলিত, সুতরাং এটি গতির একটি দুর্দান্ত আকর্ষণীয় কীর্তি, আমি মনে করি আপনি একমত হবেন। অবশ্যই, ডাব্লুসিইকে সত্যিই একটি সমান্তরাল প্রোগ্রামে পরিবর্তন করা দরকার, এবং তারপরে এটি আমার অজগর প্রোগ্রামের মোজাটি মারবে। তবে এটি আজ যেমন দাঁড়িয়েছে, gnu wc কেবল একটি ক্রমিক প্রোগ্রাম। আপনি যা পারেন তা করুন, এবং আজগুচ্ছ সমান্তরাল করতে পারে। সিথন সংকলন আমাকে সাহায্য করতে সক্ষম হতে পারে (অন্য সময়ের জন্য)। এছাড়াও মেমরি ম্যাপযুক্ত ফাইলগুলি এখনও অনুসন্ধান করা হয়নি।
HP-Z820:/mnt/fastssd$ time wc -l all_bin.csv
2367496 all_bin.csv
real 0m8.807s
user 0m1.168s
sys 0m7.636s
HP-Z820:/mnt/fastssd/fast_file_reader$ time python fastread.py --fileName="HIGGS.csv" --numProcesses=16 --balanceFactor=2
11000000
real 0m2.257s
user 0m12.088s
sys 0m20.512s
HP-Z820:/mnt/fastssd/fast_file_reader$ time wc -l HIGGS.csv
11000000 HIGGS.csv
real 0m1.820s
user 0m0.364s
sys 0m1.456s
উপসংহার: একটি গিগাবাইট সি প্রোগ্রামের তুলনায় খাঁটি অজগর প্রোগ্রামের জন্য গতি ভাল। যাইহোক, সি প্রোগ্রামের উপর খাঁটি অজগর প্রোগ্রামটি ব্যবহার করার পক্ষে এটি যথেষ্ট ভাল নয়, অন্তত অন্তর্বাসের উদ্দেশ্যে। সাধারণত কৌশলটি অন্য ফাইল প্রসেসিংয়ের জন্য ব্যবহার করা যেতে পারে, তাই এই অজগর কোডটি এখনও ভাল।
প্রশ্ন: রেজেজকে শুধুমাত্র একবারে সংকলন করে সমস্ত শ্রমিকের কাছে দিয়ে দিলে গতি উন্নত হবে? উত্তর: রেজেক্স প্রাক-সংকলন এই অ্যাপ্লিকেশনটিতে সহায়তা করে না। আমি মনে করি এর কারণ হ'ল প্রক্রিয়া সিরিয়ালাইজেশন এবং সমস্ত শ্রমিকের জন্য সৃষ্টির ওভারহেড প্রাধান্য পেয়েছে।
আরেকটা জিনিস. সমান্তরাল সিএসভি ফাইল পড়া এমনকি সাহায্য করে? ডিস্কটি কি বাধা, নাকি এটি সিপিইউ? স্ট্যাকওভারফ্লোতে প্রচুর তথাকথিত শীর্ষ-রেটে দেওয়া উত্তরগুলিতে প্রচলিত দেব বুদ্ধি রয়েছে যে কোনও ফাইল পড়তে আপনার কেবল একটি থ্রেড প্রয়োজন, সর্বোত্তম আপনি করতে পারেন, তারা বলে। তারা কি নিশ্চিত, যদিও?
খুঁজে বের কর:
HP-Z820:/mnt/fastssd/fast_file_reader$ time python fastread.py --fileName="HIGGS.csv" --numProcesses=16 --balanceFactor=2
11000000
real 0m2.256s
user 0m10.696s
sys 0m19.952s
HP-Z820:/mnt/fastssd/fast_file_reader$ time python fastread.py --fileName="HIGGS.csv" --numProcesses=1 --balanceFactor=1
11000000
real 0m17.380s
user 0m11.124s
sys 0m6.272s
ওহ হ্যাঁ, হ্যাঁ তা করে। সমান্তরাল ফাইল পড়া বেশ ভাল কাজ করে works আচ্ছা আপনি সেখানে যান!
পুনশ্চ. যদি আপনারা কেউ কেউ জানতে চেয়েছিলেন যে, একক কর্মী প্রক্রিয়াটি ব্যবহার করার সময় যদি ব্যালেন্সফ্যাক্টর 2 হয়? আচ্ছা, এটা ভয়াবহ:
HP-Z820:/mnt/fastssd/fast_file_reader$ time python fastread.py --fileName="HIGGS.csv" --numProcesses=1 --balanceFactor=2
11000000
real 1m37.077s
user 0m12.432s
sys 1m24.700s
ফাস্ট্রেড.পি পাইথন প্রোগ্রামের মূল অংশগুলি:
fileBytes = stat(fileName).st_size # Read quickly from OS how many bytes are in a text file
startByte, endByte = PartitionDataToWorkers(workers=numProcesses, items=fileBytes, balanceFactor=balanceFactor)
p = Pool(numProcesses)
partialSum = p.starmap(ReadFileSegment, zip(startByte, endByte, repeat(fileName))) # startByte is already a list. fileName is made into a same-length list of duplicates values.
globalSum = sum(partialSum)
print(globalSum)
def ReadFileSegment(startByte, endByte, fileName, searchChar='\n'): # counts number of searchChar appearing in the byte range
with open(fileName, 'r') as f:
f.seek(startByte-1) # seek is initially at byte 0 and then moves forward the specified amount, so seek(5) points at the 6th byte.
bytes = f.read(endByte - startByte + 1)
cnt = len(re.findall(searchChar, bytes)) # findall with implicit compiling runs just as fast here as re.compile once + re.finditer many times.
return cnt
পার্টিশনডাটা টু ওয়ার্কার্সের ডিএফ হ'ল সাধারণ সিক্যুয়াল কোড। সমান্তরাল প্রোগ্রামিং কেমন তা নিয়ে অন্য কোনও অনুশীলন পেতে চাইলে আমি এটিকে ছেড়ে দিয়েছি। আমি আরও শক্ত অংশগুলি নিখরচায় ছেড়ে দিয়েছি: পরীক্ষিত এবং কাজ করার সমান্তরাল কোড, আপনার শেখার সুবিধার জন্য।
ধন্যবাদ: আরনো এবং ক্লিফ এবং এইচ 2 ও কর্মীদের দ্বারা তাদের দুর্দান্ত সফ্টওয়্যার এবং নির্দেশমূলক ভিডিওগুলির জন্য ওপেন-সোর্স এইচ 2 ও প্রকল্প, যা আমাকে এই খাঁটি পাইথনের উচ্চ পারফরম্যান্স সমান্তরাল বাইট অফসেট পাঠকের উপরের মতো দেখিয়েছে above এইচ 2 ও জাভা ব্যবহার করে সমান্তরাল ফাইল রিডিং করে, পাইথন এবং আর প্রোগ্রাম দ্বারা কল করা যায় এবং বড় সিএসভি ফাইলগুলি পড়ার সময় গ্রহের যেকোন চেয়ে দ্রুত পাগল।