ফাইলআইনপুটস্ট্রিম ব্যবহার করার সময় আপনি আদর্শ বাফার আকারটি কীভাবে নির্ধারণ করবেন?


156

আমার একটি পদ্ধতি রয়েছে যা একটি ফাইল থেকে একটি বার্তাডিজাস্ট (একটি হ্যাশ) তৈরি করে এবং আমার প্রচুর ফাইল (> = 100,000) এ এটি করা দরকার। সর্বাধিক কর্মক্ষমতা দেখানোর জন্য ফাইলগুলি থেকে পড়ার জন্য আমার বাফারটি কত বড় করা উচিত?

বেশিরভাগই বেসিক কোডের সাথে পরিচিত (যা আমি এখানে কেবল পুনরায় বলব):

MessageDigest md = MessageDigest.getInstance( "SHA" );
FileInputStream ios = new FileInputStream( "myfile.bmp" );
byte[] buffer = new byte[4 * 1024]; // what should this value be?
int read = 0;
while( ( read = ios.read( buffer ) ) > 0 )
    md.update( buffer, 0, read );
ios.close();
md.digest();

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

(আমার উল্লেখ করা উচিত যে আমি জাভাতে কিছুটা নতুন, সুতরাং এটি সম্ভবত কিছু জাভা এপিআই কল হতে পারে যা আমি জানিনা))

সম্পাদনা: এটি আগে যে ধরণের সিস্টেমে ব্যবহৃত হবে তা আমি আগে জানি না, সুতরাং আমি পুরোটা ধরে নিতে পারি না। (আমি সেই কারণে জাভা ব্যবহার করছি))

সম্পাদনা করুন: উপরের কোডটিতে চেষ্টা করার মতো জিনিসগুলি অনুপস্থিত রয়েছে the

উত্তর:


213

সর্বোত্তম বাফার আকারটি কয়েকটি জিনিসের সাথে সম্পর্কিত: ফাইল সিস্টেম ব্লক আকার, সিপিইউ ক্যাশে আকার এবং ক্যাশে বিলম্ব।

বেশিরভাগ ফাইল সিস্টেমগুলি 4096 বা 8192 এর ব্লক আকারগুলি ব্যবহার করার জন্য কনফিগার করা হয় theory আপনার বাফারটি একবারে 4100 বাইট পড়ার জন্য কনফিগার করেছেন, প্রতিটি পঠনের জন্য ফাইল সিস্টেমের দ্বারা 2 টি ব্লক রিডের প্রয়োজন হবে)। যদি ব্লকগুলি ইতিমধ্যে ক্যাশে থাকে তবে আপনি র্যাম -> এল 3 / এল 2 ক্যাশে বিলম্বের মূল্য প্রদান করে শেষ করবেন না। আপনি যদি দুর্ভাগ্য হন এবং ব্লকগুলি এখনও ক্যাশে না থাকে তবে আপনি ডিস্ক-> র‌্যামের ল্যাটেন্সিরও মূল্য প্রদান করেন।

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

এখন, এটি একটি সাধারণ স্ট্রিমিং দৃশ্যে বেশ খানিকটা অফসেট হয়েছে কারণ আপনি যখন পরবর্তী পড়তে পড়েন তখন ডিস্ক থেকে পড়া ব্লকটি এখনও স্মৃতিতে থাকবে (আমরা এখানে যথাক্রমে পড়ছি, সর্বোপরি) - সুতরাং আপনি আপ শেষ করবেন না পরবর্তী পড়তে র্যাম -> এল 3 / এল 2 ক্যাশে লেটেন্সি দাম প্রদান করা হচ্ছে, তবে ডিস্ক-> র্যামের বিলম্ব নেই। প্রস্থের ক্রমের দিক থেকে, ডিস্ক-> র‌্যামের ল্যাটেন্সিটি এত ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে you

সুতরাং, আমি সন্দেহ করি যে আপনি যদি বিভিন্ন ক্যাশে আকারের পরীক্ষা করে থাকেন (নিজে নিজে এটি করেন নি) তবে আপনি সম্ভবত ফাইল সিস্টেমের ব্লকের আকার পর্যন্ত ক্যাশে আকারের একটি বড় প্রভাব খুঁজে পাবেন। তার উপরে, আমার সন্দেহ হয় যে জিনিসগুলি খুব দ্রুত স্তরে বেরিয়ে আসবে।

একটা হয় টন অবস্থার এবং ব্যতিক্রম এখানে - সিস্টেম জটিলতার আসলে বেশ টলটলায়মান হয় (ঠিক L3 উপর একটি হ্যান্ডল পেয়ে -> ও L2 ক্যাশ স্থানান্তর মন bogglingly জটিল, এবং এটা প্রতি CPU- র ধরনের সঙ্গে পরিবর্তন)।

এটি 'রিয়েল ওয়ার্ল্ড' জবাব দেয়: যদি আপনার অ্যাপ্লিকেশনটি এখানে 99% এর মতো হয় তবে ক্যাশের আকার 8192 এ সেট করুন এবং এগিয়ে যান (আরও ভাল, পারফরম্যান্সের উপরে এনক্যাপসুলেশন চয়ন করুন এবং বিশদটি আড়াল করতে বাফারডিনপুট স্ট্রিম ব্যবহার করুন)। আপনি যদি ডিস্ক থ্রুপুটের উপর নির্ভরশীল অ্যাপগুলির 1% এর মধ্যে থাকেন তবে আপনার প্রয়োগটি নৈপুণ্য তৈরি করুন যাতে আপনি বিভিন্ন ডিস্কের ইন্টারঅ্যাকশন কৌশল পরিবর্তন করতে পারেন এবং আপনার ব্যবহারকারীদের পরীক্ষা ও অনুকূলিতকরণের অনুমতি দেওয়ার জন্য নকশ এবং ডায়াল সরবরাহ করতে পারেন (বা কিছু নিয়ে আসতে পারেন) স্ব অপ্টিমাইজিং সিস্টেম)।


3
আমি উভয়টির জন্য আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটির জন্য একটি মোবাইল ফোনে (নেক্সাস 5 এক্স) কিছু ব্যাঙ্কমার্কিং করেছি: ছোট ফাইল (3,5 এমবি) এবং বড় ফাইল (175 এমবি)। এবং সোনার আকারটি 524288 দৈর্ঘ্যের বাইট [] হবে। ঠিক আছে, আপনি যদি ফাইল আকারের উপর নির্ভর করে ছোট বাফার 4Kb এবং বড় বাফার 524Kb এর মধ্যে স্যুইচ করেন তবে আপনি 10-20 মিমি জিততে পারেন। সুতরাং 524 কেবি আমার ক্ষেত্রে সেরা বিকল্প ছিল।
কিরিল করমাজিন

19

হ্যাঁ, এটি সম্ভবত বিভিন্ন জিনিসের উপর নির্ভরশীল - তবে আমি সন্দেহ করি এটি খুব বেশি পার্থক্য আনবে। আমি মেমরির ব্যবহার এবং পারফরম্যান্সের মধ্যে একটি ভাল ভারসাম্য হিসাবে 16 কে বা 32 কে বেছে নিতে চাই।

নোট করুন যে কোডটি একটি ব্যতিক্রম নিক্ষেপ করা হলেও স্রোত বন্ধ রয়েছে তা নিশ্চিত করার জন্য আপনার কোডের / শেষ অবধি ব্লক করা উচিত।


আমি চেষ্টা সম্পর্কে পোস্ট সম্পাদনা। Catch। আমার বাস্তব কোডটিতে আমার একটি রয়েছে তবে পোস্টটি খাটো করার জন্য আমি এটি ছেড়ে দিয়েছি।
আরকবান

1
আমরা যদি এর জন্য একটি নির্দিষ্ট আকার নির্ধারণ করতে চাই, তবে কোন আকারটি ভাল? 4 কে, 16 কে বা 32 কে?
ব্যাটলটেষ্ট

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

7

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


4

আদর্শ ক্ষেত্রে আমাদের একটি রিড অপারেশনে ফাইলটি পড়ার জন্য পর্যাপ্ত মেমরি থাকা উচিত। এটি সেরা পারফরমার হবে কারণ আমরা সিস্টেমটি ফাইল সিস্টেম, বরাদ্দ ইউনিট এবং ইচ্ছায় এইচডিডি পরিচালনা করতে পারি। অনুশীলনে আপনি ফাইলের আকারগুলি আগাম জানার সৌভাগ্যবান, মাত্র 4K (এনটিএফএসে ডিফল্ট বরাদ্দকরণ ইউনিট) অবধি গড় ফাইলের আকারটি ব্যবহার করুন। এবং সর্বোত্তম: একাধিক বিকল্প পরীক্ষা করতে একটি মানদণ্ড তৈরি করুন।


আপনার অর্থ কী কোনও ফাইলের পড়া এবং লেখার জন্য সেরা বাফার আকার 4k?
ব্যাটেল টেস্টেড

4

আপনি বাফার্ড স্ট্রিম / পাঠক ব্যবহার করতে পারেন এবং তারপরে তাদের বাফার আকার ব্যবহার করতে পারেন।

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


4

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


4

বাফার্ডআইনপুট স্ট্রিমের উত্সে আপনি পাবেন: ব্যক্তিগত স্ট্যাটিক ইন্টি ডিএএফএএলএফবিএফআরএফআইএস = 8192;
সুতরাং এটি আপনার ডিফল্ট মানটি ব্যবহার করার পক্ষে ওকী।
তবে আপনি যদি আরও কিছু তথ্য বের করতে পারেন তবে আরও মূল্যবান উত্তর পাবেন।
উদাহরণস্বরূপ, আপনার অ্যাডসেল সম্ভবত 1454 বাইটের একটি বাফার প্রিফার করতে পারে, এটি টিসিপি / আইপি-র পে-লোডের কারণে। ডিস্কগুলির জন্য, আপনি এমন কোনও মান ব্যবহার করতে পারেন যা আপনার ডিস্কের ব্লক আকারের সাথে মেলে।


1

ইতিমধ্যে অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, বাফার্ডইনপুট স্ট্রিম ব্যবহার করুন।

এর পরে, আমি অনুমান করি বাফার আকারটি আসলে কিছু যায় আসে না। হয় প্রোগ্রামটি I / O সীমাবদ্ধ, এবং বিআইএস ডিফল্টর উপর বর্ধমান বাফার আকার পারফরম্যান্সে কোনও বড় প্রভাব ফেলবে না।

বা প্রোগ্রামটি মেসেজডিজাস্ট.আপডেট () এর অভ্যন্তরে সিপিইউ আবদ্ধ এবং বেশিরভাগ সময় অ্যাপ্লিকেশন কোডে ব্যয় হয় না, তাই এটি টুইট করে কোনও লাভ হবে না।

(হুম ... একাধিক কোর সহ থ্রেডগুলি সহায়তা করতে পারে))


0

1024 বিভিন্ন পরিস্থিতিতে বিভিন্ন ক্ষেত্রে উপযুক্ত, যদিও বাস্তবে আপনি বৃহত্তর বা ছোট বাফার আকারের সাথে আরও ভাল পারফরম্যান্স দেখতে পাবেন।

এটি ফাইল সিস্টেমের ব্লক আকার এবং সিপিইউ হার্ডওয়্যার সহ বিভিন্ন কারণের উপর নির্ভর করবে।

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

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

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