মেমরি-ম্যাপযুক্ত ফাইলগুলির সুবিধা কী কী?


90

আমি একটি প্রকল্পের জন্য মেমরি ম্যাপযুক্ত ফাইলগুলি গবেষণা করছি এবং এমন ব্যক্তিদের যে কোনও ধারণা আগে প্রশংসনীয় হয়েছে বা তাদের ব্যবহারের বিরুদ্ধে সিদ্ধান্ত নিয়েছে এবং কেন?

বিশেষত, আমি গুরুত্বের সাথে নিম্নলিখিতগুলি সম্পর্কে উদ্বিগ্ন:

  • সম্মতি
  • এলোমেলো প্রবেশাধিকার
  • কর্মক্ষমতা
  • ব্যবহারে সহজ
  • বহনযোগ্যতা

উত্তর:


57

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

যদি আপনার অ্যাপ্লিকেশনটি মেমরি-ম্যাপযুক্ত ফাইলটিতে "স্থানে" ডেটা ব্যবহার করতে পারে, তবে এটি অনুলিপি না করেই আসতে পারে; যদি আপনি কোনও সিস্টেম কল ব্যবহার করেন (যেমন লিনাক্সের প্রিড ()) তবে এর মধ্যে সাধারণত কার্নেলের সাথে তার নিজের বাফার থেকে ব্যবহারকারীর স্থানের ডেটা অনুলিপি করা হয়। এই অতিরিক্ত অনুলিপি কেবল সময় নেয় না, তবে এই অতিরিক্ত তথ্যের অনুলিপিটি অ্যাক্সেস করে সিপিইউর ক্যাশেগুলির কার্যকারিতা হ্রাস করে।

যদি তথ্যটি আসলে ডিস্ক থেকে পড়তে হয় (যেমন শারীরিক I / O হিসাবে), তবে ওএসগুলি এখনও সেগুলিতে পড়তে হবে, একটি পৃষ্ঠার ত্রুটি সম্ভবত সিস্টেম কলের চেয়ে ভাল পারফরম্যান্স অনুযায়ী নয়, তবে তারা যদি করবেন না (যেমন ইতিমধ্যে ওএস ক্যাশে রয়েছে), তাত্ত্বিকভাবে পারফরম্যান্সটি আরও ভাল হওয়া উচিত।

ডাউনসাইডে, মেমরি-ম্যাপযুক্ত ফাইলগুলিতে কোনও অ্যাসিঙ্ক্রোনাস ইন্টারফেস নেই - যদি আপনি কোনও পৃষ্ঠা ম্যাপ না করা অ্যাক্সেস করার চেষ্টা করেন তবে এটি একটি পৃষ্ঠা ত্রুটি তৈরি করে তারপরে থ্রেডটি I / O এর জন্য অপেক্ষা করতে সক্ষম করে।


মেমরি ম্যাপ করা ফাইলগুলির স্পষ্ট অসুবিধা হ'ল 32-বিট ওএস - আপনি সহজেই ঠিকানা জায়গার বাইরে চলে যেতে পারেন।


4
উইন্ডোজে কমপক্ষে আপনি বৃহত্তর এমএমএপ ফাইলের একাধিক 32 বিট ভিউ মানচিত্র করতে পারেন - যা নিয়মিত সিআরটি ফাংশন ব্যবহার করে খুব বড় ফাইলগুলি মোকাবেলা করার চেয়ে আরও কার্যকর হতে পারে
মার্টিন বেকেট

@ মার্কআর আপনি লিখেছেন "তাঁর অতিরিক্ত অনুলিপি করতে কেবল সময় লাগে না, তবে এই অতিরিক্ত তথ্যের অনুলিপিটি অ্যাক্সেস করে সিপিইউর ক্যাশেগুলির কার্যকারিতা হ্রাস করে " " ( জোর আমার)। আপনি কী দয়া করে ব্যাখ্যা করতে পারেন যে কীভাবে কার্নেলের অতিরিক্ত বাফার অনুলিপি সিপিইউয়ের ক্যাশেগুলির কার্যকারিতা বাধা দেয়?
গিক

4
@ দ্বিগুণ মেমোরি অ্যাক্সেস করতে যান = দ্বিগুণ ক্যাশে নষ্ট হয়ে গেছে (খুব প্রায়)।
ব্যবহারকারী 253751

50

ব্যবহারকারী টাইপ করার সময় আমি একটি 'অটো সম্পূর্ণ' বৈশিষ্ট্যটি প্রয়োগ করতে একটি মেমরি ম্যাপযুক্ত ফাইল ব্যবহার করেছি। আমার একক ইনডেক্স ফাইলে ভালভাবে মিলিয়ন মিলিয়ন প্রোডাক্ট পার্ট নম্বর রয়েছে। ফাইলটিতে কিছু সাধারণ শিরোনাম সম্পর্কিত তথ্য রয়েছে তবে ফাইলের বেশিরভাগ অংশ স্থির আকারের রেকর্ডগুলির একটি বিশাল আকারের কী ক্ষেত্রের মধ্যে বাছাই করা।

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

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

4
পৃষ্ঠাগুলি প্রতিটি প্রচেষ্টার জন্য পড়ার সাথে সাথে বাইনারি অনুসন্ধানটি ধীর হবে না? নাকি অপারেটিং সিস্টেমটি দক্ষতার সাথে এটি মোকাবেলা করার জন্য যথেষ্ট স্মার্ট?
jjxtra

4
আমি মনে করি ম্যাপযুক্ত মেমরি ব্যবহার করা I / O বাইনারি অনুসন্ধানের জন্য এক ধরণের অপব্যয়, কারণ অনুসন্ধানটি তুলনামূলকভাবে দূরবর্তী মেমরির জায়গাগুলিতে কেবল কয়েকটি একক কী অ্যাক্সেস করতে পারে তবে OS যেমন প্রতিটি অনুরোধের জন্য 4k পৃষ্ঠায় লোড করবে। কিন্তু তারপরে আবার যন্ত্রাংশ সহ ফাইলটি খুব বেশি পরিবর্তন হয় না, তাই ক্যাশে এটি কভার করতে সহায়তা করে। তবে কঠোরভাবে বলতে গেলে, আমি বিশ্বাস করি যে এখানে traditionalতিহ্যবাহী অনুসন্ধান / পড়া ভাল হবে। অবশেষে, 1 মিল আজকাল খুব বেশি নয়। শুধু এটাকে র‌্যামে রাখবেন না কেন?
সোয়াইন

4
@ সোয়াইন এবং সাইকোড্যাড আমার আসল উত্তরটি ছিল ২০০৮ সাল থেকে এবং এই মেমরির ম্যাপযুক্ত অটো-সম্পূর্ণ বৈশিষ্ট্যটির আসল বাস্তবায়ন 2004-2005 বা তারও বেশি ছিল। পুরো ফাইলটি লোড করতে 800-1000MB দৈহিক মেমরি গ্রহণ করা আমাদের ব্যবহারকারী বেসের পক্ষে ভাল সমাধান ছিল না। মেমরি ম্যাপযুক্ত সমাধানটি খুব দ্রুত এবং কার্যকর ছিল। এটি লাথি মেরেছিল এবং আমি আমার প্রারম্ভিক জুনিয়র-বিকাশকারী দিন থেকে এটি স্নেহের সাথে স্মরণ করি। :)
ব্রায়ান এনসিংক

@ ব্রায়ানএন্সিঙ্ক: ঠিক আছে, তা বোঝা যায়। আমি আশা করিনি প্রতিটি এন্ট্রি 1 কেবি হিসাবে হবে। তারপরে অবশ্যই পৃষ্ঠাযুক্ত পদ্ধতির আরও দক্ষ হয়ে উঠেছে। চমৎকার :)
সোয়াইন

consuming physical memory to load the entire file was not a good solution। আপনি কেন শারীরিক স্মৃতি নিয়ে উদ্বিগ্ন তা নিশ্চিত নই (কোনও ফাইল বাইটবফারে লোড করা আরও শারীরিক স্মৃতি গ্রহণ করে ?, ওএসের বিশদটি জানায়)। ভার্চুয়াল মেমরির সাথে এমএমএপ সেই সমস্ত স্থান গ্রহণ করবে এবং নির্দিষ্ট বাইট দ্বারা কোনও ফাইল পড়া আপনার প্রয়োজন হবে না। the swineউল্লিখিত But strictly speaking, i believe that traditional seeking/reading would be better in here.। এটি একটি আকর্ষণীয় চিন্তাভাবনা, কারণ এরপরে আপনি যখন আক্ষরিক প্রয়োজন তখন আপনার প্রয়োজনীয় বাইটগুলি পড়তে পারেন।
বেন বাটারওয়ার্থ

22

মেমরি ম্যাপযুক্ত ফাইলগুলি পড়ার / লেখার অ্যাক্সেস প্রতিস্থাপন করতে বা একসাথে ভাগ করে নেওয়া সমর্থন করতে ব্যবহৃত হতে পারে। আপনি যখন এগুলি একটি ব্যবস্থার জন্য ব্যবহার করেন, আপনি অন্যটিকেও পাবেন।

কোনও ফাইলের চারপাশে দেখার এবং লেখার পরিবর্তে, আপনি এটিকে মেমরির মধ্যে ম্যাপ করে এবং কেবল বিটগুলি যেখানে আপনি প্রত্যাশা করেন তা অ্যাক্সেস করুন।

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

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

ম্যাপ করা বিশ্বে, বিপরীতে, দুটি লেখার "লেখার" প্রক্রিয়াটি কল্পনা করুন। তারা "মেমোরি স্টোরগুলি" করে এটি করে, যার ফলস্বরূপ O / S ডেটা ডিস্কের বাইরে বেরিয়ে যায় - অবশেষে। তবে এর মধ্যেই, ওভারল্যাপিং রাইটস ঘটবে বলে আশা করা যায়।

এখানে একটি উদাহরণ। বলুন আমার দুটি প্রসেস আছে 1024 অফসেটে 8 বাইট লেখা। যদি তারা ফাইল I / O ব্যবহার করে, তবে আপনি কল্পনা করতে পারেন, O / S এর গভীরে, সেখানে 1s পূর্ণ বাফার এবং 2s পূর্ণ একটি বাফার রয়েছে, উভয়ই ডিস্কে একই জায়গায় চলে গেছে। তাদের একজন প্রথমে সেখানে যাচ্ছেন, এবং অন্যটি দ্বিতীয়টি। এই ক্ষেত্রে, দ্বিতীয়টি জিতেছে। তবে , আমি যদি মেমরি-ম্যাপযুক্ত ফাইল পদ্ধতির ব্যবহার করছি, প্রক্রিয়া 1 4 বাইটের একটি মেমরি স্টোর যাবে, তার পরে 4 বাইটের আরেকটি মেমরি স্টোর থাকবে (আসুন ধরে নেওয়া যাক সর্বাধিক মেমরি স্টোরের আকার নয়)। প্রক্রিয়া 2 একই জিনিস করা হবে। প্রক্রিয়াগুলি কখন চলবে তার উপর ভিত্তি করে, আপনি নিম্নলিখিতগুলির কোনওটি দেখতে আশা করতে পারেন:

11111111
22222222
11112222
22221111

এর সমাধান হ'ল সুস্পষ্ট পারস্পরিক বর্জন use যা কোনও ইভেন্টে সম্ভবত একটি ভাল ধারণা use আপনি যেভাবেই পড়ুন / লেখার ফাইলটিতে "সঠিক জিনিস" করতে O / S এর উপর নির্ভরশীল ছিলেন।

শ্রেণিবদ্ধ পারস্পরিক বর্জন আদিম হ'ল মিটেক্স। মেমোরি ম্যাপযুক্ত ফাইলগুলির জন্য, আমি আপনাকে মেমরি-ম্যাপযুক্ত মুটেেক্সটি দেখার পরামর্শ দিচ্ছি, (যেমন) pthread_mutex_init () ব্যবহার করে উপলভ্য।

একটি গোচা দিয়ে সম্পাদনা করুন: আপনি ম্যাপযুক্ত ফাইলগুলি ব্যবহার করার সময়, ফাইলটিতেই ডেটাতে পয়েন্টার এম্বেড করার প্রলোভন থাকে ফাইলটিতে (ম্যাপ করা ফাইলটিতে লিঙ্কযুক্ত তালিকা ভাবেন)। আপনি এটি করতে চান না কারণ ফাইলটি বিভিন্ন সময়ে বিভিন্ন পরম ঠিকানায় বা বিভিন্ন প্রক্রিয়াতে ম্যাপ করা যেতে পারে। পরিবর্তে, ম্যাপ করা ফাইলের মধ্যে অফসেট ব্যবহার করুন।


1

সংমেয় একটি সমস্যা হবে। এলোমেলো অ্যাক্সেস সহজতর পারফরম্যান্স দুর্দান্ত। ব্যবহারে সহজ. ভাল হিসাবে না। বহনযোগ্যতা - এত গরম না।

আমি এগুলি অনেক আগে একটি সূর্যের সিস্টেমে ব্যবহার করেছি এবং সেগুলি আমার ধারণা।

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