এই ডেটা সংরক্ষণ করার সবচেয়ে কার্যকরী উপায় কী?


9

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

ব্যবহারকারীকে একটি জিইউতে তাদের গাড়ির নির্মাতা, মেক, মডেল এবং রঙ বাছাই করতে হবে। আমার কাছে একটি বিশাল টেক্সট ফাইল রয়েছে যা দেখতে এরকম কিছু দেখাচ্ছে:

Ford Truck F150 red
Ford Truck F150 blue
Ford Truck F150 black
Ford Truck F150 silver
Ford Truck F250 red
Ford Truck F250 green
Ford Sedan Taurus red
Ford Sedan Taurus green
Ford Sedan Taurus white
Ford...
...

Subaru SUV Forester blue
Subaru SUV Forester red
Subaru SUV Outback Black
Subaru SUV Outback Green
Subaru SUV Outback Blue
Subaru SUV Outback Red
Subaru...
...

etc.

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

আমার আগে কোড লিখেছেন এমন লোকেরা এটি নিয়ে এসেছিল (পাইথন-ওয়াই স্যুয়েডোকোডে):

def getValidOptions():
    items = []
    for i from 0 to numRows:
        options = getLine().split()
        if selectingManufacturer:
            if options[0] not in items:
                items.append(options[0])
        else if selectingMake:
            if selectedManufacturer == options[0] and options[1] not in items:
               items.append(options[1])
        else if selectingModel:
            if selectedManufacturer == options[0] and selectedMake == options[1] and options[2] not in items:
                items.append(options[2])
        else if selectingColor:
            if selectedManufacturer == options[0] and selectedMake == options[1] and selectedModel == options[2] and options[3] not in items:
                items.append(options[3])
    return items

আমি মনে করি এটি কেবল অ্যালগোরিদম স্তরে এবং একটি বাক্য গঠন স্তরে উভয়ই ঘৃণ্য। একটির জন্য, এটি পুরো ফাইলটি পার্স করে, যখন এটি সঠিকভাবে করা হয় কেবল তখন কয়েকটি লাইন পড়ে। এটিকে আরও অকার্যকর করার জন্য, আমার আসল ডেটাতে কেবল 4 এর পরিবর্তে 6 টি নির্বাচন করার জন্য বিকল্প রয়েছে যা এটি আরও বেশি ডেটা সংরক্ষণ করে তার পরে ডাটা ডুপ্লিকেশনটির পরিমাণের ভিত্তিতে এটি প্রয়োজন।

আমি ফাইলে ডেটা সংরক্ষণ করার একটি আলাদা উপায় বা getValidOptionsফাংশনটিকে আরও সুন্দর এবং আরও দক্ষ করার জন্য এটি আলাদা করে আলাদা পদ্ধতিতে খুঁজছি । আমি কি এটি করতে পারে কোন উপায় আছে?


2
কেন একটি ডাটাবেস ব্যবহার করবেন না?
তুলাইনস কর্ডোভা

উত্তর:


6

আমি অন্যান্য যে সমস্ত উত্তর পড়েছি সেগুলি সফ্টওয়্যার বিকাশের দুটি খুব প্রাথমিক নিয়মকে উপেক্ষা করবে বলে মনে হচ্ছে:

  • প্রথমে প্রয়োজনীয়তাগুলি পরিষ্কার করুন (বিশেষত কর্মক্ষমতা এবং স্টোরেজ প্রয়োজনীয়তা)

  • এটি সরল রাখুন, বোকা ( কেআইএসএস দেখুন )

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

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

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

# selectedOptions is a list, containing either nothing, or "selectedManufacturer"
# or [selectedManufacturer, selectedMake], ..., and so on
def getValidOptions(selectedOptions):
    items = []
    level = selectedOptions.size()
    for i from 0 to numRows:
        options = getLine().split()
        if selectedOptions == options[0:level-1] and options[level] not in item:
            items.append(options[level])
    return items

সুতরাং এটি মূলত একই অ্যালগরিদম যার কোনও পুনরাবৃত্তি কোড নেই।

যেহেতু এটি স্পষ্টত getValidOptionsএকাধিকবার কল করা উচিত (প্রতি স্তর প্রতি কমপক্ষে একবার) তবে আমি কেবলমাত্র একটি অপ্টিমাইজেশন প্রয়োগ করার পরামর্শ দিই (যদি এটি ইতিমধ্যে ঘটনা না হয়): নিশ্চিত করুন যে getLineফাংশনটি মূল স্মৃতি থেকে তার ডেটা টেনে নিয়েছে এবং না করে বার বার ডিস্ক থেকে ফাইলটি পড়ুন।


আপনি নাম্বার লুপের আগে "স্তর = নির্বাচিতঅভিশন.সাইজ ()" সরাতে চান।
এআই ব্রেভেরেলি

6

ঠিক আছে, আপনার যে ডেটা রয়েছে সেগুলি গাছের মতো কাঠামো রয়েছে, যেখানে প্রতিটি নির্মাতার জন্য আপনার কাছে একটি মডেলের গাছ থাকে এবং প্রতিটি মডেলের জন্য আপনার রঙ থাকে (এবং আরও কিছু)।

সুতরাং, আপনি এই পদক্ষেপের প্রক্রিয়াটিকে দুটি পদক্ষেপে পৃথক করতে পারেন:

  1. পাঠ্য ফাইলে কোনও আপডেট হওয়ার পরে আপনাকে অবশ্যই সেই ফাইল ফাইলটি প্রক্রিয়া করতে হবে এবং এটিকে গাছের কাঠামোতে রূপান্তর করতে হবে।
  2. অ্যাপ্লিকেশনটি লোড করার সময় আপনি কেবল গাছের কাঠামো লোড করুন।

গাছের কাঠামোটি জাভা, পিএইচপি, জাভাস্ক্রিপ্ট বা পাইথনের মতো ভাষাগুলিতে হ্যাশ , একটি সহযোগী অ্যারে বা অভিধান হিসাবে ডাকা হয় তার সাথে প্রয়োগ করা যেতে পারে । এই কাঠামোর সাহায্যে আপনার রয়েছে:

  • প্রথম কীগুলি নির্মাতারা।
  • তাদের মানগুলি অন্য একটি হ্যাশ বা অভিধান যেখানে প্রতিটি কী মডেল the
  • তাদের মান রং হয়। অথবা তাদের কীগুলিতে তৃতীয় স্তর এবং চতুর্থ স্তরের মান হিসাবে রেখে অন্য কোনও কাঠামো।
  • এবং আরও ...

আপনার প্রোগ্রামিং ভাষার উপর নির্ভর করে এটি দ্রুত বা ধীর প্রয়োগ করা যেতে পারে। উদাহরণ স্বরূপ:

  • সি # : আপনি একটি গাছ কাঠামো 1 বাস্তবায়ন করতে পারেন এবং তারপরে এটি সিরিয়ালযোগ্য হিসাবে চিহ্নিত করতে পারেন।
  • ভিবি.নেট : আপনি একটি প্রয়োগে গাছের কাঠামো তৈরি করতে পারেন এবং এটি একটি ফাইলে সিরিয়ালাইজ করতে পারেন।
    • এই জন্য, মত কিছু Runtime.Serialization.Formatters.Binary.BinaryFormatterদরকারী হতে পারে, কিন্তু আমি ভিবি.নেট দিয়ে সিরিয়ালাইজেশন বিশেষজ্ঞ নয়।
  • জাভাস্ক্রিপ্ট : আপনি একটি JSON ফাইলে গাছের কাঠামো তৈরি করতে পারেন, অ্যাপটি লোড হওয়ার সাথে সাথে অবশ্যই এটি লোড করা উচিত।
  • পিএইচপি : আপনি গাছের ডেটা কাঠামোর একটি ক্রমিক সংস্করণ তৈরি করতে পারেন, বা আপনি একটি JSON লোড করতে পারেন।
  • জাভা : আপনি যে ডাটা স্ট্রাকচার ধারাবাহিকভাবে পারেন, একটি তৈরি Classযে কার্যকরী ইন্টারফেস java.io.Serializable

তথ্যসূত্র :

1: https://dvenderboom.wordpress.com/2008/03/15/treet-implementing-a-non-binary-tree-in-c/
- C # তে একটি গাছ বাস্তবায়নের সম্পূর্ণ বিবরণ।
- এমন একটি মন্তব্য দেখুন যেখানে কেউ object বস্তুটি সিরিয়ালকরণের বিষয়ে জিজ্ঞাসা করেন এবং সেই মন্তব্যের উত্তরটি।


1
হ্যাঁ, আমি একটি গাছ ব্যবহারের কথা ভেবেছিলাম, তবে আমি জানি না এটি সেরা ধারণা কিনা কারণ সি # তে গাছের কাঠামোর (যা আমি জানি) কোনও নির্মিত হয়নি, এবং প্রকল্পটি খুব ছোট তাই আমি জানি না কিনা এটি tree with an arbitrary number of nodesবাস্তবায়নে কাজ করতে খুব বেশি সময় ব্যয় করা উপযুক্ত হবে ।
জেমস

এখনও আমি সি # এর সাথে বিশেষজ্ঞ নই, তবে জাভা এবং পিএইচপি এর মতো অন্যান্য ভাষায় আপনার কাছে কিছু ধরণের অভিধান থাকতে পারে, যেখানে প্রতিটি কীতে অন্য অভিধানের মান থাকতে পারে।
নিকোলস

আমি আমার উত্তর আপডেট। হ্যাশ বা অভিধান বিকল্প সম্পর্কে আপনি কী ভাবেন তা দেখুন। আমি একটি আকর্ষণীয় নিবন্ধ সঙ্গে একটি রেফারেন্স যোগ।
নিকোলের

3

ডেটা সংরক্ষণ করার একটি সহজ উপায় হ'ল এটি কেবল এসকিউএল ডাটাবেজে স্টাফ করা। বেশিরভাগ এসকিউএল ডাটাবেসের বিপরীতে এসকিউএলাইট অ্যাপ্লিকেশন ফাইল ফর্ম্যাট হিসাবে ব্যবহারের জন্য উপযুক্ত suited এই পদ্ধতির বিভিন্ন সুবিধা রয়েছে:

  1. সিরিয়ালাইজার বা ডিসরিওলাইজার কোড করার দরকার নেই।
  2. ফাইল প্রচুর বিদ্যমান প্রোগ্রাম দ্বারা সম্পাদনযোগ্য এবং অনুসন্ধানযোগ্য।
  3. প্রশ্নে আপনি যে শর্তযুক্ত উল্লেখ করেছেন তা এড়ানো যায়। ড্রপডাউনগুলি সীমাবদ্ধ করতে, প্রতিটি কলামের (যেমন, select distinct model where manufacturer='ford' and color = 'red') বিপরীতে একটি সাধারণ উত্পন্ন করুন ।

এটি আপনাকে এসকিউএল শিখতে বাধ্য করে, তবে একটি কাস্টম ফাইল ফর্ম্যাট শেখার প্রয়োজনীয়তা এড়িয়ে যায়।


1

আমি ধরে নিচ্ছি আপনি এলোমেলোভাবে ফাইলটিতে লাইনগুলি অ্যাক্সেস করতে পারবেন এবং এইভাবে ফাইলটিকে রেকর্ডের অ্যারে হিসাবে বিবেচনা করতে পারবেন। আপনি যদি এলোমেলোভাবে লাইনগুলি অ্যাক্সেস করতে না পারেন তবে আপনার কাছে থাকা অ্যালগরিদমটি আপনি সবচেয়ে ভাল করতে পারেন।

দ্রুততম অ্যাক্সেসের জন্য, 6 টি ফাইলে ডেটা সঞ্চয় করুন, যেখানে প্রতিটি ফাইল পরেরটিতে সূচি হয় is

ফ্ল্যাটফায়াল সূচকগুলি তৈরি করার বিভিন্ন উপায় রয়েছে। আমি সাধারণত সাবস্ক্রিপ্টের ব্যাপ্তি ব্যবহার করি। ব্যবহারকারী প্রতিটি নির্বাচন করার সময়, পরবর্তী ফাইলটি পড়া সীমাবদ্ধ করতে ব্যাপ্তিটি ব্যবহার করুন।

আপনার প্রদত্ত নমুনা ডেটার জন্য আমি সূচকগুলি কীভাবে তৈরি করব তা এখানে।

অবশ্যই ফাইলটি বাছাই করতে হবে। আমি উদাহরণের জন্য লাইনগুলি গণনা করেছি; লাইন নম্বরগুলি ফাইলটিতে প্রদর্শিত হবে না।

--| file3.dat |--
 0 Ford Truck F150 red
 1 Ford Truck F150 blue
 2 Ford Truck F150 black
 3 Ford Truck F150 silver
 4 Ford Truck F250 red
 5 Ford Truck F250 green
 6 Ford Sedan Taurus red
 7 Ford Sedan Taurus green
 8 Ford Sedan Taurus white
 9 Subaru SUV Forester blue
10 Subaru SUV Forester red
11 Subaru SUV Outback Black
12 Subaru SUV Outback Green
13 Subaru SUV Outback Blue
14 Subaru SUV Outback Red

প্রথম সূচক তৈরি করতে, ফাইলের প্রথম তিনটি ক্ষেত্রের প্রতিটি অনন্য সংমিশ্রণের জন্য একটি রেকর্ড তৈরি করুন। প্রতিটি রেকর্ডে, প্রথম এবং শেষ লাইন নম্বরগুলি সংরক্ষণ করুন যেখানে সেই সংমিশ্রণটি উপস্থিত হবে।

--| file2.dat |--
 0 Ford Truck F150       0   3
 1 Ford Truck F250       4   5
 2 Ford Sedan Taurus     6   8
 3 Subaru SUV Forester   9  10
 4 Subaru SUV Outback   11  14

প্রথম সূচকের প্রথম দুটি ক্ষেত্র ব্যবহার করে দ্বিতীয় সূচকটি একইভাবে নির্মিত হয়।

--| file1.dat |--
 0 Ford Truck        0   1
 1 Ford Sedan        2   2
 2 Subaru SUV        3   4

এবং তৃতীয়, এই ক্ষেত্রে শীর্ষ স্তর, সূচক।

--| file0.dat |--
 0 Ford          0   1
 1 Subaru        2   2

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

কিছু অপ্রয়োজনীয় ডেটা বাদ দিয়ে আপনি ফাইল স্টোরেজ প্রয়োজনীয়তা আরও কমাতে পারেন।

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

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

সূচক ক্যাসকেডের ন্যূনতম উপস্থাপনাটি এরকম দেখতে শেষ হয়, যেখানে টিক 'এমন একটি সংখ্যা নির্দেশ করে যা আসলে ফাইলটিতে সঞ্চিত নয়।

--| file0.dat |--
 0' Ford         0'   1
 1' Subaru       2'   2

--| file1.dat |--
 0' Truck        0'   1
 1' Sedan        2'   2
 2' SUV          3'   4

--| file2.dat |--
 0' F150         0'   3
 1' F250         4'   5
 2' Taurus       6'   8
 3' Forester     9'  10
 4' Outback     11'  14

--| file3.dat |--
 0' red
 1' blue
 2' black
 3' silver
 4' red
 5' green
 6' red
 7' green
 8' white
 9' blue
10' red
11' Black
12' Green
13' Blue
14' Red

আপনি যখন একটি সূচক থেকে একটি নির্বাচন তালিকা পূরণ করেন, আপনি পংক্তিত রেখাগুলি সীমাবদ্ধ করতে পূর্ববর্তী সূচীতে ব্যবহারকারীর নির্বাচন থেকে "প্রথম" এবং "শেষ" সাবস্ক্রিপ্ট ব্যবহার করেন।

উদাহরণ:

আপনি সব থেকে প্রথম নির্বাচন তালিকা পূরণ করুন file0.dat। (ফোর্ড, সুবারু)

ব্যবহারকারী "ফোর্ড" নির্বাচন করে। সংশ্লিষ্ট সাবস্ক্রিপ্টগুলি 0 এবং 1 হয়।

আপনি 1 এর 1 টির মধ্য দিয়ে দ্বিতীয় বাছাইয়ের তালিকাটি পূরণ করুন file1.dat। (ট্রাক, সেদন)

ব্যবহারকারী "সেদন" নির্বাচন করেন। সংশ্লিষ্ট সাবস্ক্রিপ্টগুলি 2 এবং 2 হয়।

আপনি দেখতে পাচ্ছেন যে, ব্যবহারকারী নির্বাচনের সময় দ্বারা, উদাহরণস্বরূপ, "ফোর্ড" "সেদান" "বৃষ" আপনাকে দেখতে পাবে যে file3.datচতুর্থ নির্বাচনী তালিকাটি পূরণ করতে আপনাকে 8 থেকে 8 টি লাইনই পড়তে হবে ।

আমি বরং দীর্ঘ বিবরণের জন্য ক্ষমা চাইছি তবে এখানে খুব দেরি হয়ে গেছে এবং আমার একটি সংক্ষিপ্ত লেখার সময় নেই।

যুক্ত: আরও ভাবার পরে, ফাইলগুলি একটিতে সংযুক্ত করা যায়।

--| file.dat |--
 0' -            1'   2
 1' Ford         3'   4
 2' Subaru       5'   5
 3' Truck        6'   7
 4' Sedan        8'   8
 5' SUV          9'  10
 6' F150        11'  14
 7' F250        15'  16
 8' Taurus      17'  19
 9' Forester    20'  21
10' Outback     22'  25
11' red          -'   -
12' blue         -'   -
13' black        -'   -
14' silver       -'   -
15' red          -'   -
16' green        -'   -
17' red          -'   -
18' green        -'   -
19' white        -'   -
20' blue         -'   -
21' red          -'   -
22' Black        -'   -
23' Green        -'   -
24' Blue         -'   -
25' Red          -'   -

এটি একাধিক ফাইল সংস্করণের মতো হ'ল ব্যবহৃত হয়, ব্যতীত আপনার প্রথম সাবস্ক্রিপ্টের ব্যাপ্তি থাকতে ডামি প্রথম লাইনের প্রয়োজন।

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