আমি ইন্টার্নশিপের জন্য ইদানীং বড় ডেটা সম্পর্কিত একটি নতুন প্রকল্পে কাজ শুরু করেছি। আমার পরিচালকরা কার্যকরী প্রোগ্রামিং শেখার জন্য সুপারিশ করেছিলেন (তারা অত্যন্ত স্ক্যালার প্রস্তাবিত)। এফ # ব্যবহার করে আমার একটি নম্র অভিজ্ঞতা ছিল, তবে প্রোগ্রামিংয়ের এই দৃষ্টান্তটি ব্যবহারের গুরুত্বপূর্ণটি আমি দেখতে পেলাম না কারণ এটি কিছু ক্ষেত্রে ব্যয়বহুল।
ডিন এই বিষয়টি সম্পর্কে একটি আকর্ষণীয় বক্তৃতা দিয়েছেন এবং "বিগ ডেটা" এখানে তার চিন্তাভাবনাগুলি ভাগ করেছেন: http://www.youtube.com/watch?v=DFAdLCqDbLQ তবে এটি খুব সুবিধাজনক ছিল না কারণ বিগ ডেটা বোঝায় না শুধুমাত্র হাদুপ
বিগডাটা হিসাবে খুব অস্পষ্ট ধারণা। আমি কিছুক্ষণের জন্য ভুলে গেছি যখন আমরা ডেটা নিয়ে কাজ করি তখন বিভিন্ন দিকের মধ্যে তুলনা করার জন্য, কার্যকরী উপায়টি ব্যয়বহুল কি না তা দেখার জন্য আমি একটি সাধারণ উদাহরণ দিয়ে হাজির করার চেষ্টা করেছি। যদি ফাংশনাল প্রোগ্রামিং ছোট ডেটার জন্য ব্যয়বহুল এবং মেমরির খরচ হয় তবে বিগ ডেটার জন্য আমাদের এটির কেন দরকার?
অভিনব সরঞ্জামগুলির থেকে দূরে, আমি তিনটি পদ্ধতির ব্যবহার করে একটি নির্দিষ্ট এবং জনপ্রিয় সমস্যার সমাধান সমাধান করার চেষ্টা করেছি: আবশ্যক উপায় এবং কার্যকরী উপায় (পুনরাবৃত্তি, সংগ্রহগুলি ব্যবহার করে)। তিনটি পদ্ধতির মধ্যে তুলনা করার জন্য আমি সময় এবং জটিলতার তুলনা করেছি।
আমি এই ফাংশনগুলি লিখতে স্কালাকে ব্যবহার করেছি কারণ এটি তিনটি দৃষ্টান্ত ব্যবহার করে একটি অ্যালগরিদম লেখার সেরা সরঞ্জাম
def main(args: Array[String]) {
val start = System.currentTimeMillis()
// Fibonacci_P
val s = Fibonacci_P(400000000)
val end = System.currentTimeMillis()
println("Functional way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s, end - start))
val start2 = System.currentTimeMillis()
// Fibonacci_I
val s2 = Fibonacci_I(40000000 0)
val end2 = System.currentTimeMillis();
println("Imperative way: \n the Fibonacci sequence whose values do not exceed four million : %d \n Time : %d ".format(s2, end2 - start2))
}
কার্যকরী উপায়:
def Fibonacci_P(max: BigInt): BigInt = {
//http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Stream
//lazy val Fibonaccis: Stream[Long] = 0 #:: 1 #:: Fibonaccis.zip(Fibonaccis.tail).map { case (a, b) => a + b }
lazy val fibs: Stream[BigInt] = BigInt(0)#::BigInt(1)#::fibs.zip(fibs.tail).map {
n = > n._1 + n._2
}
// println(fibs.takeWhile(p => p < max).toList)
fibs.takeWhile(p = > p < max).foldLeft(BigInt(0))(_ + _)
}
পুনরাবৃত্তির উপায়:
def Fibonacci_R(n: Int): BigInt = n match {
case 1 | 2 = > 1
case _ = > Fibonacci_R(n - 1) + Fibonacci_R(n - 2)
}
প্রয়োজনীয় উপায়:
def Fibonacci_I(max: BigInt): BigInt = {
var first_element: BigInt = 0
var second_element: BigInt = 1
var sum: BigInt = 0
while (second_element < max) {
sum += second_element
second_element = first_element + second_element
first_element = second_element - first_element
}
//Return
sum
}
আমি লক্ষ্য করেছি যে ফাংশনাল প্রোগ্রামিং ভারী! এটি বেশি সময় নেয় এবং স্মৃতিতে আরও স্থান গ্রহন করে। আমি বিভ্রান্ত হয়ে পড়েছি, যখনই আমি কোনও নিবন্ধ পড়ি বা কোনও আলোচনা দেখি, তারা বলে যে আমাদের ডাটা সায়েন্সে ফাংশনাল প্রোগ্রামিং ব্যবহার করা উচিত। সত্য, এটি ডেটা ওয়ার্ল্ডে সহজ এবং আরও উত্পাদনশীল। তবে এটি আরও সময় এবং আরও মেমরির জায়গা নেয়।
সুতরাং, আমাদের বিগ ডেটাতে ফাংশনাল প্রোগ্রামিং ব্যবহার করার দরকার নেই কেন? বিগ ডেটার জন্য ক্রিয়ামূলক প্রোগ্রামিং (স্কালা) ব্যবহার করার সেরা অনুশীলনগুলি কী কী?