হাস্কেল প্রোডাকশন কোডে সিক কতবার ব্যবহৃত হয়?


23

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

সম্প্রতি আমি এমন একটি ফিল্টার ব্যবহার করার চেষ্টা করেছি যা স্বাভাবিকের চেয়ে প্রায় 10 গুণ বড় এবং আমি একটি Stack space overflowত্রুটি পেয়েছি ।

কিছু পঠন করার পরে (যেমন এখানে এবং এখানে ) আমি স্ট্যাক স্পেস সংরক্ষণ করার জন্য দুটি গাইডলাইন সনাক্ত করেছি (অভিজ্ঞ হাসকলার্স, আমি যদি সঠিক কিছু না লিখি তবে দয়া করে আমাকে সংশোধন করুন):

  1. পুচ্ছ-পুনরাবৃত্তি না করে এমন পুনরাবৃত্তির ফাংশন কলগুলি এড়িয়ে চলুন (এটি টেল-কল অপ্টিমাইজেশান সমর্থন করে এমন সমস্ত কার্যকরী ভাষার জন্য বৈধ)।
  2. seqউপ-এক্সপ্রেশনগুলির প্রাথমিক মূল্যায়নকে বাধ্য করার জন্য পরিচয় করিয়ে দিন যাতে ভাবগুলি হ্রাস হওয়ার আগে খুব বেশি বৃদ্ধি না পায় (এটি হাস্কেলের জন্য নির্দিষ্ট, বা কমপক্ষে অলস মূল্যায়ন ব্যবহার করে ভাষাগুলিতে)।

seqআমার কোডে পাঁচ বা ছয়টি কল প্রবর্তন করার পরে আমার সরঞ্জামটি আবার সুচারুভাবে চলতে চলেছে (বৃহত্তর ডেটাতেও)। তবে, আমি দেখতে পাই যে মূল কোডটি কিছুটা বেশি পঠনযোগ্য ছিল।

যেহেতু আমি একজন অভিজ্ঞ হাস্কেল প্রোগ্রামার নই আমি জিজ্ঞাসা করতে চেয়েছিলাম যে seqএইভাবে প্রবর্তন করা একটি সাধারণ অনুশীলন, এবং সাধারণত সাধারণত কতবার seqহাস্কেল প্রোডাকশন কোডটিতে দেখা যায়। বা এমন কোনও কৌশল রয়েছে যা seqখুব বেশি সময় ব্যবহার এড়াতে দেয় এবং এখনও সামান্য স্ট্যাক স্পেস ব্যবহার করতে পারে ?


1
আপনি বর্ণিত ধরণের মত অপ্টিমাইজেশন প্রায় সবসময় কোডটিকে কিছুটা মার্জিত করে তুলবে।
রবার্ট হার্ভে

@ রবার্ট হার্ভে: স্ট্যাকের ব্যবহার কম রাখার বিকল্প বিকল্প আছে কি? আমি বোঝাতে চাইছি যে আমি আমার ফাংশনগুলি অন্যরকমভাবে লিখতে হবে তবে সুপরিচিত প্রযুক্তি রয়েছে কিনা সে সম্পর্কে আমার কোনও ধারণা নেই। আমার প্রথম প্রয়াসটি ছিল লেজ-পুনরাবৃত্ত ফাংশনগুলি ব্যবহার করা, যা আমাকে সাহায্য করেছিল তবে আমার সমস্যাটি পুরোপুরি সমাধান করতে দেয় নি।
জর্জিও

উত্তর:


17

দুর্ভাগ্যক্রমে এমন অনেকগুলি ক্ষেত্রে রয়েছে যখন seqবড় ডেটার জন্য দক্ষ / ভাল কাজের প্রোগ্রাম পাওয়ার জন্য কাউকে ব্যবহার করতে হয়। সুতরাং অনেক ক্ষেত্রে, আপনি উত্পাদন কোড ছাড়া এটি করতে পারবেন না। আপনি রিয়েল ওয়ার্ল্ড হাস্কেল, অধ্যায় 25- এ আরও তথ্য পেতে পারেন Prof প্রোফাইলিং এবং অপ্টিমাইজেশন

তবে, seqসরাসরি ব্যবহার এড়াতে কীভাবে সম্ভাবনা রয়েছে । এটি কোড ক্লিনার এবং আরও শক্তিশালী করতে পারে। কিছু ধারণা:

  1. এর পরিবর্তে নালী , পাইপ বা পুনরাবৃত্তি ব্যবহার করুন interact। অলস আইওর সাহায্যে রিসোর্সগুলি পরিচালনা করার সমস্যা রয়েছে (কেবল মেমরি নয়) এবং পুনরুক্তিগুলি এগুলি কাটিয়ে উঠার জন্য ঠিক নকশা করা হয়েছে। (আপনার ডেটা যত বড় হোক তা বিবেচনা না করেই আমি অলস আইও এড়াতে পরামর্শ দেব - অলস আই / ও সমস্যাটি দেখুন ))
  2. এর পরিবর্তে ব্যবহার করার seqসরাসরি ব্যবহার করুন (অথবা আপনার নিজের নকশা) যেমন combinators foldl ' বা foldr' বা (যেমন লাইব্রেরি কঠোর সংস্করণ Data.Map.Strict বা Control.Monad.State.Strict ) যে কঠোর কম্পিউটেশনের জন্য ডিজাইন করা হয়।
  3. BangPatterns এক্সটেনশন ব্যবহার করুন । এটি seqকঠোর প্যাটার্ন মিলের সাথে প্রতিস্থাপন করতে দেয় । কঠোর নির্মাণকারী ক্ষেত্রের ঘোষণা কিছু ক্ষেত্রে কার্যকরও হতে পারে।
  4. জোর করে মূল্যায়ন করার জন্য কৌশলগুলি ব্যবহার করাও সম্ভব । কৌশল লাইব্রেরির বেশিরভাগই সমান্তরাল গণনাগুলির লক্ষ্য, তবে ডাব্লুএইচএএনএফ ( rseq) বা সম্পূর্ণ এনএফ ( rdeepseq) এর জন্যও মান চাপানোর পদ্ধতি রয়েছে । সংগ্রহের সাথে কাজ করার কৌশলগুলি একত্রিত করার জন্য অনেকগুলি ইউটিলিটি পদ্ধতি রয়েছে etc.

+1: দরকারী ইঙ্গিত এবং লিঙ্কগুলির জন্য ধন্যবাদ। পয়েন্ট 3টি বেশ আকর্ষণীয় বলে মনে হচ্ছে (এবং এই মুহূর্তে আমার ব্যবহারের সবচেয়ে সহজ সমাধান)। পরামর্শ 1 সম্পর্কে, আমি অলস আইও এড়ানো কীভাবে জিনিসগুলিকে উন্নতি করতে পারে তা দেখতে পাচ্ছি না: যতদূর আমি বুঝতে পারি অলস আইও এমন ফিল্টারের জন্য আরও ভাল হওয়া উচিত যা ডেটা (সম্ভবত খুব দীর্ঘ) প্রবাহের প্রক্রিয়া করার জন্য বলে মনে করা হয়।
জর্জিও

2
অলস আইওর সমস্যা নিয়ে @ জিয়েরজিও আমি হাস্কেল উইকির একটি লিঙ্ক যুক্ত করেছি। অলস আইও এর সাহায্যে আপনার সংস্থানগুলি পরিচালনা করতে খুব কঠিন সময় থাকতে পারে। উদাহরণস্বরূপ, আপনি যদি পুরোপুরি ইনপুটটি না পড়েন (অলস মূল্যায়নের কারণে), ফাইল হ্যান্ডেলটি উন্মুক্ত থাকবে । এবং যদি আপনি নিজে যান এবং ম্যানুয়ালি ফাইল হ্যান্ডেলটি বন্ধ করেন তবে প্রায়শই এমন হয় যে অলস মূল্যায়নের পড়ার কারণে এটি স্থগিত হয়ে যায় এবং পুরো ইনপুটটি পড়ার আগে আপনি হ্যান্ডেলটি বন্ধ করে দেন। এবং, অলস আইও সহ স্মৃতি সমস্যাগুলি এড়ানো প্রায়শই বেশ শক্ত।
পেটর পুডলাক

আমার সম্প্রতি এই সমস্যা হয়েছিল এবং আমার প্রোগ্রামটি ফাইল বর্ণনাকারীর বাইরে চলে গেছে। তাই আমি অলস আইওকে প্রতিস্থাপন করে কঠোর আইও ব্যবহার করে কঠোর ব্যবহার করব ByteString
জর্জিও
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.