मैंने अपनी इंटर्नशिप के लिए बिग डेटा से संबंधित एक नई परियोजना पर काम करना शुरू कर दिया है। मेरे प्रबंधकों ने कार्यात्मक प्रोग्रामिंग सीखना शुरू करने की सिफारिश की (वे अत्यधिक अनुशंसित स्काला)। मुझे F # का उपयोग करने का एक विनम्र अनुभव था, लेकिन मैं प्रोग्रामिंग के इस प्रतिमान का उपयोग करने के लिए महत्वपूर्ण नहीं देख सका क्योंकि यह कुछ मामलों में महंगा है।
डीन ने इस विषय पर एक दिलचस्प बात कही, और यहाँ "बिग डेटा" पर अपने विचार साझा किए: http://www.youtube.com/watch?v=DFAdLCqDbLQ लेकिन यह बहुत सुविधाजनक नहीं था क्योंकि बिग डेटा का मतलब यह नहीं है केवल Hadoop।
जैसा कि बिगडाटा बहुत अस्पष्ट अवधारणा है। मैं इसे कुछ समय के लिए भूल जाता हूं। मैंने एक सरल उदाहरण के साथ आने का प्रयास किया जब हम डेटा के साथ विभिन्न पहलुओं के बीच तुलना करते हैं, यह देखने के लिए कि कार्यात्मक तरीका महंगा है या नहीं। यदि कार्यात्मक प्रोग्रामिंग महंगा है और छोटे डेटा के लिए मेमोरी-खपत है, तो हमें बिग डेटा के लिए इसकी आवश्यकता क्यों है?
फैंसी उपकरणों से दूर, मैंने तीन दृष्टिकोणों का उपयोग करके एक विशिष्ट और लोकप्रिय समस्या के लिए एक समाधान बनाने की कोशिश की: इंपीरियल तरीका और कार्यात्मक तरीका (पुनरावृत्ति, संग्रह का उपयोग करके)। मैंने तीन दृष्टिकोणों के बीच तुलना करने के लिए समय और जटिलता की तुलना की।
मैंने इन कार्यों को लिखने के लिए स्काला का उपयोग किया क्योंकि यह तीन प्रतिमानों का उपयोग करके एल्गोरिथ्म लिखने का सबसे अच्छा उपकरण है
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
}
मैंने देखा कि कार्यात्मक प्रोग्रामिंग भारी है! इसमें अधिक समय लगता है और मेमोरी में अधिक जगह की खपत होती है। मैं भ्रमित हूं, जब भी मैं एक लेख पढ़ता हूं या एक बात देखता हूं, तो वे कहते हैं कि हमें डेटा विज्ञान में कार्यात्मक प्रोग्रामिंग का उपयोग करना चाहिए। सच है, यह आसान और अधिक उत्पादक है, विशेष रूप से डेटा की दुनिया में। लेकिन इसमें अधिक समय और अधिक मेमोरी स्पेस लगता है।
तो, हमें बिग डेटा में फ़ंक्शनल प्रोग्रामिंग का उपयोग करने की आवश्यकता क्यों है? बिग डेटा के लिए कार्यात्मक प्रोग्रामिंग (स्काला) का उपयोग करने के लिए सबसे अच्छे अभ्यास क्या हैं?