বিগ ডেটা কার্যকর করার প্রয়োজন কেন?


9

আমি ইন্টার্নশিপের জন্য ইদানীং বড় ডেটা সম্পর্কিত একটি নতুন প্রকল্পে কাজ শুরু করেছি। আমার পরিচালকরা কার্যকরী প্রোগ্রামিং শেখার জন্য সুপারিশ করেছিলেন (তারা অত্যন্ত স্ক্যালার প্রস্তাবিত)। এফ # ব্যবহার করে আমার একটি নম্র অভিজ্ঞতা ছিল, তবে প্রোগ্রামিংয়ের এই দৃষ্টান্তটি ব্যবহারের গুরুত্বপূর্ণটি আমি দেখতে পেলাম না কারণ এটি কিছু ক্ষেত্রে ব্যয়বহুল।

ডিন এই বিষয়টি সম্পর্কে একটি আকর্ষণীয় বক্তৃতা দিয়েছেন এবং "বিগ ডেটা" এখানে তার চিন্তাভাবনাগুলি ভাগ করেছেন: 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
}

আমি লক্ষ্য করেছি যে ফাংশনাল প্রোগ্রামিং ভারী! এটি বেশি সময় নেয় এবং স্মৃতিতে আরও স্থান গ্রহন করে। আমি বিভ্রান্ত হয়ে পড়েছি, যখনই আমি কোনও নিবন্ধ পড়ি বা কোনও আলোচনা দেখি, তারা বলে যে আমাদের ডাটা সায়েন্সে ফাংশনাল প্রোগ্রামিং ব্যবহার করা উচিত। সত্য, এটি ডেটা ওয়ার্ল্ডে সহজ এবং আরও উত্পাদনশীল। তবে এটি আরও সময় এবং আরও মেমরির জায়গা নেয়।

সুতরাং, আমাদের বিগ ডেটাতে ফাংশনাল প্রোগ্রামিং ব্যবহার করার দরকার নেই কেন? বিগ ডেটার জন্য ক্রিয়ামূলক প্রোগ্রামিং (স্কালা) ব্যবহার করার সেরা অনুশীলনগুলি কী কী?


5
ক্রিয়ামূলক প্রোগ্রামিং আপনার কোডটির সমান্তরালকরণকে আরও সহজ করে তোলে, সুতরাং যদি কোনও একক ক্রিয়াকলাপটি একটি থ্রেডে চালাতে আরও বেশি সময় নিতে পারে তবে সমান্তরালতার কারণে সামগ্রিক কর্মক্ষমতা আরও ভাল হতে পারে।
জর্জিও

@ জর্জিও: সমান্তরালতার সর্বোত্তম পারফরম্যান্স পাওয়ার জন্য অভিনেতা মডেলিং হিসাবে বিভিন্ন দৃষ্টান্ত রয়েছে ms তাই মনে হয় না?
ব্যবহারকারী 3047512

2
আমি এটির সহজ ধারণা অনুমান করি কারণ হ্যাডোপ থেকে মানচিত্র / পন্থা হ্রাস করা কার্যকরী প্রোগ্রামিংয়ের একটি ধারণা।
ডক ব্রাউন

1
@ ইউজার 3047512: উদাহরণস্বরূপ, এরলং অভিনেতা মডেল ব্যবহার করে এবং বেশিরভাগ অংশের জন্য কার্যকর।
জর্জিও

2
"বিগ ডেটা" ফ্যাড এবং এফপির মধ্যে সংযোগটি এতটা সোজা নয়। "বিগ ডেটা" তে একটি তথাকথিত মানচিত্র-হ্রাস পদ্ধতির ফ্যাশনেবল, যা ঘুরেফিরে কিছুটা কার্যকরী প্রোগ্রামিং নীতি দ্বারা অনুপ্রাণিত হয়েছিল। এখানেই সাদৃশ্যটি শেষ হয়, আমি এই দুটি পৃথিবীর মধ্যে আর কোনও সংযোগ দেখতে পাচ্ছি না।
এসকে-লজিক 16

উত্তর:


13

আমি এটি কীভাবে দেখছি তা এখানে:

  • আসুন কিছুক্ষণের জন্য "বিগ ডেটা" শব্দটিকে উপেক্ষা করুন, কারণ এগুলি একটি বেশ অস্পষ্ট ধারণা

  • আপনি হাদুপের কথা উল্লেখ করেছেন। হাডোপ দুটি কাজ করে: আপনাকে এক ধরণের "ভার্চুয়াল" ড্রাইভের অনুমতি দেয় যা একাধিক মেশিনে বিতরণ করা হয়, রিডানডেন্সির সাথে, যা হ্যাডোপের এপিআইয়ের মাধ্যমে অ্যাক্সেস করা যেতে পারে যেমন এটি একক, একক, ড্রাইভ। এটি হডোপ বিতরণকারী ফাইল সিস্টেম হিসাবে এইচডিএফএস বলা হয় । হ্যাডোপ অন্য কাজটি আপনাকে মানচিত্র-হ্রাস কাজগুলি সম্পাদন করার অনুমতি দেয় (এটি মানচিত্র-হ্রাসের জন্য একটি কাঠামো)। আমরা যদি মানচিত্রের উইকিপিডিয়া পৃষ্ঠাটি পরীক্ষা করে দেখি তবে আমরা তা দেখতে পেলাম:

ম্যাপ্রেডিউস একটি ক্লাস্টারে সমান্তরাল, বিতরণ অ্যালগরিদম সহ বৃহত ডেটা সেটগুলি প্রক্রিয়াজাতকরণের জন্য একটি প্রোগ্রামিং মডেল।

...

একটি মানচিত্রের প্রোগ্রামটি একটি মানচিত্র () পদ্ধতির সমন্বয়ে গঠিত যা ফিল্টারিং এবং বাছাই করে (যেমন প্রথম নাম দিয়ে শিক্ষার্থীদের বাছাই করে সারি, প্রতিটি নামের জন্য একটি সারি) এবং একটি হ্রাস () পদ্ধতি যা সংক্ষিপ্ত ক্রিয়া সম্পাদন করে (যেমন সংখ্যা গণনা করার মতো) প্রতিটি কাতারে থাকা শিক্ষার্থীদের, নাম ফ্রিকোয়েন্সি উত্পাদন করে)

...

'ম্যাপ্রেডিউস' একটি বিশাল সংখ্যক কম্পিউটার ব্যবহার করে বিশাল ডেটাসেটগুলিতে সমান্তরাল সমস্যার প্রক্রিয়াজাতকরণের জন্য একটি কাঠামো

এছাড়াও এই পৃষ্ঠায়, হাদুপ হিসাবে বর্ণনা করা হয়েছে

হ্যাডোপ, অ্যাপাচে ম্যাপ্রেইডুসের ফ্রি এবং ওপেন সোর্স বাস্তবায়ন।

এখন, হ্যাডোপ জাভাতে লেখা, যা কার্যকরী ভাষা নয়। এছাড়াও, যদি আমরা হ্যাডোপের পৃষ্ঠাগুলি সন্ধান করি তবে জাভাতে কীভাবে মানচিত্রের কাজ তৈরি করতে হবে এবং এটি হ্যাডোপ ক্লাস্টারে স্থাপন করা যায় তার উদাহরণও আমরা পাই ।

হ্যাডোপের জন্য একটি ফিবননাচি মানচিত্রের কাজের জাভা উদাহরণ।

আমি আশা করি এটি আপনার প্রশ্নের উত্তর দেয়, যথা বিগডাটা এবং বিশেষত কোনও ফিবোনাচি তৈরির মানচিত্রের কাজটি "ক্রিয়াকলাপ" হওয়ার দরকার হয় না, আপনি চাইলে ওও ভাষায় এটি প্রয়োগ করতে পারেন (উদাহরণস্বরূপ)।

অবশ্যই এর অর্থ এই নয় যে বিগডাটা কেবলমাত্র ওও হতে হবে "প্রয়োজন"। কাজের মতো মানচিত্রের প্রয়োগ করতে আপনি খুব কার্যকরী ভাষা ব্যবহার করতে পারেন। উদাহরণস্বরূপ, স্কালডিংয়ের মাধ্যমে আপনি চাইলে হ্যাডোপের সাথে স্কালা ব্যবহার করতে পারেন ।

আমার মনে হয় অন্যান্য বিষয়গুলি উল্লেখযোগ্য worth

স্কেলে পুনরাবৃত্তি করার সময়, যদি আপনার কোড এটিকে মঞ্জুরি দেয় তবে স্কালা লেজ-কল-অপ্টিমাইজেশন করবে । তবে, যেহেতু জেভিএম (এখনও) টেল-কল-অপ্টিমাইজেশান সমর্থন করে না , সংকলনের সময় স্কালা এটিকে প্রতিস্থাপন করে এটি অর্জন করে, এখানে বর্ণিত হিসাবে লুপগুলির সমতুল্য কোডগুলির সাথে আপনার পুনরাবৃত্ত কলগুলি । এর মূল অর্থটি হ'ল স্কেল ব্যবহার করে রিকার্সি বনাম নন-রিকার্সিভ কোড মাপদণ্ডটি করা অর্থহীন, কারণ তারা উভয়ই রান সময় একই কাজ করে।


2
আপনি জেভিএম টেল কল অপটিমাইজেশন সমর্থন করে না যা ওপির প্রস্তাবিত মানদণ্ডকে ক্ষুন্ন করে দেয় সে সম্পর্কে আপনি একটি দুর্দান্ত বক্তব্য রেখেছেন। এটি একটি খুব তথ্যমূলক উত্তর, আপনাকে ধন্যবাদ।
ম্যাপেল_শ্যাফট

1
আপনার উত্তরের জন্য ধন্যবাদ, হ্যাঁ! টেল-কল-অপটিমাইজেশন হোল্ড স্কেল বৈশিষ্ট্যগুলির মধ্যে একটি। stackoverflow.com/questions/1025181/hided-features-of-scala/… । "বিগ ডেটা" এর অন্যতম সমস্যা হ'ল প্রতিটি সংস্থা বিভিন্ন উপায়ে একটি নতুন প্রযুক্তি তৈরির চেষ্টা করছে। তবে প্রধানত দুটি রয়েছে: হ্যাডোপ টেক এবং অন্যান্য। যেমনটি আপনি বলেছিলেন, এটি বিষয়গত এবং এটি নিজেরাই যে সমস্যার সাথে সম্পর্কিত তা আমাদের দক্ষতার উপর ভিত্তি করে সঠিক প্রোগ্রামিং দৃষ্টান্ত বেছে নেওয়া উচিত। উদাহরণস্বরূপ: রিয়েল-টাইম প্রেডিকটিভ মডেলগুলি হ্যাডোপ প্ল্যাটফর্মগুলিতে খুব ভাল কাজ করে না।
ব্যবহারকারীর 3047512

9

যতক্ষণ আপনি এটি একটি একক মেশিনে চালাতে পারেন, এটি "বিগ ডেটা" নয়। আপনার উদাহরণস্বরূপ সমস্যাটি এ সম্পর্কে কিছু প্রদর্শন করা সম্পূর্ণ অনুপযুক্ত।

বিগ ডেটা বলতে বোঝায় যে সমস্যার আকারগুলি এত বড় যে প্রসেসিং বিতরণ করা কোনও অপ্টিমাইজেশন নয় বরং একটি মৌলিক প্রয়োজন। এবং কার্যক্ষম প্রোগ্রামিং অপরিবর্তনীয় ডেটা স্ট্রাকচার এবং স্টেটহীনতার কারণে সঠিক এবং দক্ষ বিতরণ কোড লিখতে অনেক সহজ করে তোলে।


"বিগ ডেটা বলতে বোঝায় যে সমস্যার আকারগুলি এত বড় যে প্রসেসিং বিতরণ করা কোনও অপ্টিমাইজেশন নয়, একটি মৌলিক প্রয়োজনীয়তা।" - আমি বুঝতে পারি না কোন ধরণের সমস্যাটি একটি মেশিনের সাহায্যে সমস্ত সমস্যার সমাধান করা যায় না, এবং কমপক্ষে এন প্রয়োজন যেখানে এন> 1 ...
শিবান ড্রাগন

6
@ শিভানড্রাগন: এমন এক ধরণের সমস্যা যার মধ্যে পারফরম্যান্স প্রয়োজনীয়তা রয়েছে যা একক সিস্টেমে সন্তুষ্ট করা সম্পূর্ণ অসম্ভব। বা যেখানে ডেটা আকার এত বড় যে কোনও একক সিস্টেম এমনকি এটি সব সঞ্চয় করতে পারে না।
মাইকেল বর্গওয়ার্ট

আমি দুঃখিত, আমি এখন আপনার পয়েন্ট দেখতে। আপনি কি উল্লেখ করছেন এটি সঠিক নয়, আরও বিশেষভাবে ম্যাপ্রেইডুস যা বিগডাটার ছত্রছায়ায় বাস করে?
শিবান ড্রাগন

আপনার ইনপুট জন্য আপনাকে ধন্যবাদ, আমি সম্মত। আমার দৃষ্টিকোণটি প্রদর্শন করার জন্য আমি কোনও ভাল সাধারণ উদাহরণ খুঁজে পাইনি। "বিগ ডেটা" এখনও এমন এক উপায়ে বিকাশকারীরা 3 ভি এর সংজ্ঞা বিবেচনা করে আমাদের প্রতিদিনের সমস্যাগুলি সমাধান করার জন্য ডেটা ব্যবহার করে। আমি কিছুক্ষণের জন্য 3 ভি ভুলে যাব এবং ডেটা ব্যবহার করে খুব সাধারণ দিকটি নিয়ে কথা বলব। যদি আমরা দেখতে পাই যে একটি কার্যকরী উপায়ে ডেটা বিশ্লেষণ ব্যয়বহুল, তবে আমরা কেন বলব যে "বিগ ডেটা" কার্যকরী হওয়া দরকার? এটা আমার বক্তব্য।
ব্যবহারকারী 3047512

4
@ শিভানড্রাগন, উদাহরণস্বরূপ, এলএইচসি প্রতি সেকেন্ডে বেশ কয়েকটি গিগাবাইট ডেটা তৈরি করছে । কোনও একক মেশিন এমনকি এমন একটি থ্রুপুট পরিচালনা করতে পারে তা নিশ্চিত নয়।
এসকে-লজিক 16

4

আমি স্কেল জানি না এবং তাই আপনার কার্যকরী পদ্ধতির বিষয়ে আমি মন্তব্য করতে পারি না, তবে আপনার কোডটি ওভারকিলের মতো দেখাচ্ছে।

অন্যদিকে আপনার পুনরাবৃত্ত ফাংশনটি অদক্ষ। যেহেতু ফাংশনটি নিজেকে দু'বার কল করে, এটি অর্ডার 2 ^ n, যা অত্যন্ত অদক্ষ। আপনি যদি তিনটি পদ্ধতির তুলনা করতে চান তবে আপনাকে তিনটি অনুকূল বাস্তবায়ন তুলনা করতে হবে।

ফিবোনাচি ফাংশনটি একবারে ফাংশনটি কল করার জন্য পুনরাবৃত্তভাবে প্রয়োগ করা যেতে পারে। আসুন একটি আরও সাধারণ সংজ্ঞা দেওয়া যাক:

F(0) = f0
F(1) = f1
F(n) = F(n-1) + F(n-2)

স্ট্যান্ডার্ড বিশেষ কেসটি হ'ল:

f0 = 0
f1 = 1

সাধারণ পুনরাবৃত্তির কাজটি হ'ল:

function fibonacci($f0, $f1, $n){
    if($n < 0 || !isInt($n)) return false;
    if($n = 0) return $f0;
    if($n = 1) return $f1;
    return fibonacci($f1, $f0 + $f1, $n - 1);
}

ধন্যবাদ! আপনি একটি ভাল পয়েন্ট উত্থাপন করেছেন, তবে পুনরাবৃত্ত উপায়ে এটি করার কোনও কার্যকর উপায় নেই। এটি খুব সাধারণ একটি প্রোব (ফাইবোনাচি স্যুট)। এবং তিনটি উপায়ে একই সমস্যাটি মোকাবেলা করার বিষয়টি এই। আপনি কোনও প্রোগ্রামিং ভাষা ব্যবহার করে এই সমস্যা সমাধানের আরও ভাল উপায়ের পরামর্শ দিতে পারেন, আমি আবার লিখতে পারি যে স্কালা ব্যবহার করে এবং একই পরীক্ষাগুলি করতে পারি?
ব্যবহারকারী 3047512

@ ব্যবহারকারী 3047512 একটি ভাষা যা লেজ পুনরাবৃত্তি সমর্থন করে, আপনি এটি সঞ্চয়ী দিয়ে লিখতে পারেন। উদাহরণ
toasted_flakes

Scala এছাড়াও লুকানো বৈশিষ্ট্য হিসাবে লেজ পুনরাবৃত্তির সমর্থন oldfashionedsoftware.com/2008/09/27/...
user3047512

1
@ ইউজার 3047512 কারণ পুনরাবৃত্ত সমাধানটি একটি খাঁটি ফাংশন (আউটপুট কেবলমাত্র ফাংশন আরগস এবং অন্য কোনও কিছুর উপর নির্ভর করে ), স্মৃতিচারণ একটি ভাল সমাধান। সহজভাবে বলুন, প্রতিবার এটি কোনও মান ফেরত দেবে, আরগগুলি সংরক্ষণ করবে এবং ফলস্বরূপ একটি কী / মান হ্যাশ আসবে এবং প্রতিবার ফাংশনটি চালিত হলে প্রথমে সেখানে দেখুন। এটি খাঁটি ফাংশনগুলির অন্যতম সুবিধা - এই ফাংশনটিতে ভবিষ্যতের কলটি প্রিসিস্টিং হ্যাশ মানটি খুঁজে পাবে এবং শূন্য গণনা করবে, কারণ আমরা জানি ফলাফল পরিবর্তন হবে না।
ইজকাটা

@ ব্যবহারকারী 3047512 পুনরাবৃত্ত সংস্করণটি এই ক্ষেত্রে খাঁটি ফাংশনের মতো দেখায়, তবে এটি সর্বদা সত্য নয় - কার্যকরী ভাষায়, আমি বিশ্বাস করি এটি ভাষা দ্বারা আরও কার্যকর করা হয়েছে ...
ইজকাটা

0

যদি ফাংশনাল প্রোগ্রামিং ছোট ডেটার জন্য ব্যয়বহুল এবং মেমরির খরচ হয় তবে বিগ ডেটার জন্য আমাদের এটির কেন দরকার?

বিশেষত আমি ইতিমধ্যে কয়েকটি অ্যাপ্লিকেশন দেখতে পাচ্ছি যেখানে এটি অত্যন্ত কার্যকর। প্রাক্তন। পরিসংখ্যান, যেমন বিভিন্ন পরামিতি বা ডেটা বিশ্লেষণের জন্য পরামিতিগুলির সেট সহ ফ্লাইতে গাউসিয়ান ফাংশন গণনা করা। সংখ্যার বিশ্লেষণ ইত্যাদির জন্য অন্তরঙ্গ রয়েছে etc.

বিগ ডেটার জন্য ক্রিয়ামূলক প্রোগ্রামিং (স্কালা) ব্যবহার করার সেরা অনুশীলনগুলি কী কী?

দক্ষতা সম্পর্কে জবাব দেওয়ার জন্য স্পেস বা সময়গুলিতে আপনার দক্ষতা বাড়াতে সহায়তা করার কৌশলগুলি রয়েছে, বিশেষত পুনরাবৃত্তি, লেজ পুনরাবৃত্তি , ধারাবাহিকতা পাস করার শৈলী , উচ্চ-অর্ডার ক্রিয়াকলাপ ইত্যাদি Some কিছু ভাষায় তাদের উপকারিতা এবং কনস রয়েছে (উদাহরণস্বরূপ অলস বনাম আগ্রহী)) ফিবোনাচি সিক্যুয়েন্সের মতো সহজ কিছু আমি কেবল আবশ্যকীয় উপায়টি ব্যবহার করতে পারি কারণ আমার সময়ে দেখা যায় যে আমার সহকর্মীদের মধ্যে কিছু অনিচ্ছুক এবং কার্যকরী প্রোগ্রামিংয়ে স্বাচ্ছন্দ্য বোধ করতে পারে না এবং তাই আরও বিকাশের সময় নিতে পারে ... (আমি এখনও পছন্দ করি যখন আমি [অ্যাপ্লিকেশনগুলির দায়িত্বে আছি] করতে পারি তখন কার্যকরী প্রোগ্রামিং ব্যবহার করুন যেহেতু আমি এটি দ্রুত, পরিষ্কার এবং "পড়তে সহজ" (যদিও আমি এই বিষয়বস্তুটি খুঁজে পাই) কোড পাই find

উইকিপিডিয়ায় ফাইবোনাচি সিকোয়েন্সের একটি "দ্রুত" সংস্করণ পোস্ট করা হয়েছে। https://en.wikipedia.org/wiki/Functional_programming#Scala

def fibTailRec(n: Int): Int = {
  @tailrec def f(a: Int, b: Int, c: Int): Int = if (a == 0) 0 else if(a < 2) c else f(a-1, c, b + c)
  f(n, 0, 1)
}

স্ট্রিম / হাফ ব্যবহার করা

val fibStream:Stream[Int] = 0 #:: 1 #:: (fibStream zip fibStream.tail).map{ t => t._1 + t._2 }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.