কীভাবে লিনাক্স সাবডিরেক্টরিজ নম্বর সীমা সমাধান করবেন?


9

আমার একটি ওয়েবসাইট রয়েছে যা ব্যবহারকারীর প্রোফাইল চিত্রগুলি সঞ্চয় করবে। প্রতিটি চিত্র ব্যবহারকারীর জন্য নির্দিষ্ট একটি ডিরেক্টরিতে (লিনাক্স) সংরক্ষণ করা হয়। বর্তমানে আমার কাছে 30+ এর গ্রাহক বেস রয়েছে যার অর্থ আমার কাছে 30+ ফোল্ডার থাকবে। তবে আমার বর্তমান লিনাক্স বাক্স (ext2 / ext3) 32000 এর বেশি ডিরেক্টরি তৈরি করতে সমর্থন করে না। আমি কিভাবে এই অতীত পেতে পারি? এমনকি ইউটিউব ছেলেরাও ভিডিও থাম্বনেইল সহ একই সমস্যা পেয়েছে। তবে তারা এটি রিসরফ এ নিয়ে সমাধান করেছেন। আমাদের কি এর চেয়ে ভাল সমাধান হতে পারে না?

আপডেট: আইআরসি-তে জিজ্ঞাসা করা হলে, লোকেরা এটিকে এক্সট৪-এ উন্নীত করার বিষয়ে জিজ্ঞাসা করেছিল, যার সীমা 64k এবং আপনি অবশ্যই এটি অতীতও পেতে পারেন । বা সীমা পরিবর্তন করতে কার্নেল হ্যাকিং।

আপডেট: ইউজারিড রেঞ্জের উপর ভিত্তি করে ইউজার বেসটি ফোল্ডারে বিভক্ত করার বিষয়ে। একটি ফোল্ডারে 1-1000, অন্যটিতে 1000-2000 অর্থ। এটি সহজ বলে মনে হচ্ছে। কি বলো ছেলেরা?

সত্যি বলতে কি, অন্য কোনও উপায় নেই?


1
আপনি ফাইল সিস্টেম পরিবর্তন করতে চান না কেন? এটি যদি ext2 / 3 এর সীমাবদ্ধতা থাকে তবে আপনার ফাইল সিস্টেম পরিবর্তন করা বা বর্তমান FS কে আরও ছোট এফএসে বিভক্ত করা (আরও বিভিন্ন মাউন্ট পয়েন্ট) ছাড়া আর কোনও পরিবর্তন হবে না।
ম্যানুয়েল ফক্স

1
ম্যানুয়েল: যদি তিনি ফাইল সিস্টেম পরিবর্তন করেন তবে তিনি তার অ্যাপ্লিকেশনটিতে একটি নির্দিষ্ট এফএস বেঁধে রাখছেন। যদিও এটির উত্তরটি শেষ হতে পারে তবে আমি সম্ভবত এটিই এমন একটি সমস্যা যা অ্যাপ্লিকেশন পর্যায়ে সমাধান করা দরকার। আপনার যদি কার্নেল বা ফাইল সিস্টেম হ্যাক করার প্রয়োজন হয় তবে খুব সম্ভবত বিশেষ প্রয়োজনীয়তা না থাকলে আপনি সম্ভবত ভুল পথে চলে যাচ্ছেন।
কাইল ব্র্যান্ড্ট

উত্তর:


16

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

top_level_dir
|---aa
|   |---aardvark1
|   |---aardvark2
|---da
|   |---dan
|   |---david
|---do
    |---don

আরও ভাল হবে নামের কিছু হ্যাশ তৈরি করা এবং বিভাগের জন্য এটি ব্যবহার করা। প্রাথমিক অক্ষরের উদাহরণ সহ "দা" খুব পূর্ণ এবং "zz" পুরোপুরি খালি থাকায় এভাবে আপনি ডিরেক্টরিগুলির মধ্যে আরও ভাল ছড়িয়ে পড়বেন। উদাহরণস্বরূপ আপনি যদি সিআরসি বা এমডি 5 নাম নেন এবং প্রথম 8 টি বিট ব্যবহার করেন তবে আপনি কিছুটা পছন্দ পাবেন:

top_level_dir
|---00
|   |---some_username
|   |---some_username
|---01
|   |---some_username
...
|---FF
|   |---some_username

এটি প্রয়োজন মতো আরও গভীরতায় প্রসারিত হতে পারে, উদাহরণস্বরূপ যেমন যদি ব্যবহারকারীর নামটি হ্যাশ মান না ব্যবহার করে:

top_level_dir
|---a
|   |---a
|       |---aardvark1
|       |---aardvark2
|---d
    |---a
    |   |---dan
    |   |---david
    |---o
        |---don

এই পদ্ধতিটি স্কুডির ক্যাশে, লুডভিগের উদাহরণ এবং ওয়েব ব্রাউজারগুলির স্থানীয় ক্যাশে অনুলিপি করার জন্য অনেক জায়গায় ব্যবহৃত হয়।

একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয়: ext2 / 3 দিয়ে ডিরেক্টরিগুলি রৈখিকভাবে অনুসন্ধান করা হওয়ায় আপনি যেভাবেই 32,000 সীমাটি কাছে যাওয়ার আগে আপনি পারফরম্যান্সের সমস্যার সমাধান করতে শুরু করবেন। অন্য ফাইল সিস্টেমে সরিয়ে নেওয়া (উদাহরণস্বরূপ ext4 বা রিসার) এই অদক্ষতাটি সরিয়ে ফেলবে (রিসার দুটি বাইনারি-স্প্লিট অ্যালগরিমথের সাহায্যে ডিরেক্টরিগুলি অনুসন্ধান করে যাতে দীর্ঘ ডিরেক্টরিগুলি আরও বেশি দক্ষতার সাথে পরিচালিত হয়, এক্সট 4 এছাড়াও করতে পারে) পাশাপাশি প্রতি ডিরেক্টরি নির্ধারিত সীমা।


এটি অন্তর্ভুক্ত করার জন্য কেবলমাত্র প্রশ্নের বর্ণনাকে আপডেট করেছে: "আপডেট: ইউজারিড রেঞ্জের উপর ভিত্তি করে ইউজার বেসটি ফোল্ডারে বিভক্ত করার বিষয়ে কীভাবে folder এক ফোল্ডারে 1-1000 অর্থ, অন্যটিতে 1000-2000 এর মতো This এটি সহজ বলে মনে হয় What তুমি কি বলো?"
নাই-দা

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

থ্যাঙ্কিও ডেভিড! আমি আরও বিভিন্ন সমাধান চেষ্টা করেছি। 1-30000, 30000-60000 ইত্যাদি পরিসীমা সহ আমি খুব কমই 4 টি ফোল্ডার তৈরি করেছি I আমি মনে করি যে এত বড় ডিরেক্টরি থেকে একটি ফাইল পাওয়া 1000 ডলার (পূর্ববর্তী পদ্ধতির) ডিরেক্টরি থেকে বেশি সময় নেবে। কি বলো?
কোনও নয়

1
এটি ফাইল সিস্টেমের উপর নির্ভর করে। আপনি যদি ext2 বা ext3 ব্যবহার করেন তবে আমি প্রতি ডিরেক্টরি 30,000 এর চেয়ে অনেক ছোট প্রস্তাব দেব। কিছু সরঞ্জাম 10,000 টি সম্পর্কে সতর্কতা জারি করে। সহায়তার জন্য আপনি ext3 / 4 এ ডিরেক্টরি সূচীটি চালু করতে পারেন: tune2fs -O dir_index / dev / <volumename> তবে কেবল একটি ডিরেক্টরিতে বস্তুর সংখ্যা কম রাখা (কয়েক হাজার বা তার চেয়ে কম?) আমি এখানে সুপারিশ করছি ।
ডেভিড স্পিলিট

@ ম্যাডি, আপনি কীভাবে অতিরিক্ত 2/3 ফাইলগুলি সংখ্যক পরিচালনা করে তার অন্যান্য সীমাবদ্ধতার কারণে আপনি এই সমাধানটি চান। কিছু বিশদ জানতে সার্ভারফল্ট / প্রশ্ন / 43133/… দেখুন । বালতি-হিসাবে-সাব-ডিরেক্টরিতে নাম ছড়িয়ে দেওয়া অন্যান্য সমস্যাগুলি হ্রাস করে যা আপনি শেষ পর্যন্ত দেখতে পেতেন। মনে রাখবেন যে এটি একই কৌশল যা স্কুইড ব্যবহার করে যখন এটি প্রথমবারের জন্য অবজেক্ট ক্যাশে সেট আপ করে - উদাহরণস্বরূপ, উদাহরণস্বরূপ, যার মধ্যে directories৪ টি ডিরেক্টরি সহ each৪ টি ডিরেক্টরি রয়েছে।
অ্যাভেরি পেইন

7

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

যদি এটি কেবল আমার প্রোফাইল চিত্রগুলির সম্পর্কে থাকে তবে:

  1. চিত্রটির একটি হ্যাশ (যেমন SHA1) ব্যবহার করুন
  2. ফাইল এবং ডিরেক্টরি নাম হিসাবে SHA1 ব্যবহার করুন

উদাহরণস্বরূপ, এসকিউইউড ক্যাশে এটি করে:

চ / 4b / 353ac7303854033

শীর্ষ স্তরের ডিরেক্টরি হ'ল প্রথম হেক্স-ডিজিট, দ্বিতীয় স্তরটি হ'ল পরবর্তী দুটি হেক্স-ডিজিট এবং ফাইলটির নাম বাকী হেক্স-ডিজিট।


2

আমাদের কি আরও ভাল সমাধান হতে পারে?

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

ফাইল সিস্টেমগুলির তুলনার জন্য এখানে দেখুন

খুব খুশি হোন যে আপনি এনটিএফএসের সাথে আটকে ছিলেন না যা কোনও ডিরেক্টরিতে প্রচুর ফাইলের জন্য সত্যই অস্বস্তিকর। তুলনামূলকভাবে নতুন (তবে দৃশ্যত স্থিতিশীল) এক্সট 4 এফএস ব্যবহার করতে অভিনব না হলে আমি জেএফএসকে প্রতিস্থাপন হিসাবে সুপারিশ করব।


এনটিএফএস ফাইল সিস্টেমের পারফরম্যান্সে আপনার কি ভাল লিঙ্ক রয়েছে?
থরবজর্ন রাভন অ্যান্ডারসন

হ্যাঁ, কোনও অ্যাপ্লিকেশানের সাথে ব্যক্তিগত অভিজ্ঞতা বাদে যা ডিরেক্টরিতে নতুন ফাইল তৈরি করতে খুব বেশি সময় বাকি ছিল .. (সেগুলি মুছতে বেশ কয়েক ঘন্টা সময় লেগেছিল), এবং কোনও ডিরেক্টরিতে ফাইলের সংখ্যা সীমাবদ্ধ করে সাবভার্সন পারফরম্যান্স বৃদ্ধি করে। বা পড়ুন : সমর্থন.microsoft.com/kb/130694 এটি এখনও পারফ হিসাবে চিহ্নিত হিসাবে তারা কখনও এটিকে "স্থির" করে বলে আমি মনে করি না। এনটিএফএসের জন্য টুইট।
gbjbaanb

1

প্রোফাইল চিত্রটি কি ছোট? বাকি প্রোফাইল ডেটা সহ এটি ডাটাবেসে রাখার কী আছে? এটি আপনার পক্ষে সেরা বিকল্প নাও হতে পারে তবে বিবেচনা করার মতো ...

এই বিষয়টিতে একটি (পুরানো) মাইক্রোসফ্ট হাইটপেপার রয়েছে: BLOB করতে বা BLOB- এ নয়


1

আমি একসাথে একটি ছোট ওয়েব গ্যালারী হ্যাক করেছি, যেখানে আমি এই সমস্যার বিভিন্নতা দিয়ে শেষ করেছি; আমার "কেবল" ক্যাশে ডিরেক্টরিতে। 30.000 চিত্র ছিল যা বেশ ধীর হয়ে গেছে (ext2 ডিরেক্টরি সূচকগুলির জন্য লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করে, যেমনটি আমি মনে করি)।

আমি এই লাইনের সাথে কিছু করে শেষ করেছি:

def key2path(key):
    hash = md5(key)
    return os.path.join(hash[0], hash[1], key)

এটি 256 ডিরেক্টরিগুলিতে ডেটা বিভক্ত করবে, যা তিনটি স্তরের প্রতিটি জন্য একটি ডিরেক্টরি ডিরেক্টরি প্রদর্শন করে।

  • আমি SHA-1 এর উপরে MD5 ব্যবহার করা বেছে নিয়েছি, কারণ আপনি 32 এর 12 টি বিট পরিবর্তন করলে MD5 একটি আলাদা আউটপুট গ্যারান্টি দেয়, সুতরাং ব্যবহারকারীর নাম, ডিরেক্টরি এবং অন্যান্য সংক্ষিপ্ত স্টাফ হ্যাশ করার জন্য এটি আমার কাছে উপযুক্ত find এবং এটি খুব দ্রুত ...
  • আমি সম্পূর্ণ হ্যাশটি অন্তর্ভুক্ত করি না, কারণ এটি অনেকগুলি ডিরেক্টরি তৈরি করে এবং কার্যকরভাবে ডিস্ক-ক্যাশে বার বার ট্র্যাশ করে।

1
আপনি সম্ভবত সিআরসি-র মতো একটি সহজ হ্যাশ ব্যবহার করতে পারেন, কারণ হ্যাশটি এমডি 5 বা
এসএএ-র

0

আপনার সমস্যার কোনও তাত্ক্ষণিক উত্তর নয়, তবে ভবিষ্যতের রেফারেন্সের জন্য দেখার মতো কিছু হ'ল 'এপিটোম' নামক ওপেনবিএসডি সংযুক্ত প্রকল্প is

এপিটোম এমন একটি ইঞ্জিন যা একক ইনস্ট্যান্স স্টোরেজ, সামগ্রী ঠিকানাযোগ্য স্টোরেজ এবং ডিডুকিপিকেশন পরিষেবা সরবরাহ করে।

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

এপিটোম বর্তমানে পরীক্ষামূলক, তবে ভবিষ্যতের জন্য দেখার মতো কিছু।


0

সাধারণত আপনি এতে প্রচুর ফাইল / ডিরেক্টরি সহ ডিরেক্টরি থাকা এড়াতে চান। প্রাথমিক কারণ হ'ল কমান্ড লাইনে ওয়াইল্ডকার্ড সম্প্রসারণের ফলে "খুব বেশি যুক্তি" ত্রুটি হতে পারে যার ফলে এই ডিরেক্টরিগুলির সাথে কাজ করার চেষ্টা করার সময় অনেক ব্যথা হয়।

এমন একটি সমাধানের জন্য যান যা আরও গভীর কিন্তু সঙ্কুচিত গাছ তৈরি করে, যেমন অন্যদের বর্ণিত যেমন সাবফোল্ডার তৈরি করে।


0

আমাদের অনুরূপ সমস্যা ছিল, সমাধান - যেমনটি পূর্বে উল্লিখিত - ডিরেক্টরিগুলির একটি শ্রেণিবিন্যাস তৈরি করা।

অবশ্যই আপনার যদি একটি জটিল অ্যাপ্লিকেশন থাকে যা ফ্ল্যাট ডিরেক্টরি কাঠামোর উপর নির্ভর করে, আপনার সম্ভবত অনেকগুলি প্যাচিংয়ের প্রয়োজন হবে। সুতরাং এটি জেনে রাখা ভাল যে এখানে কার্যনির্বাহী রয়েছে, এমন সিমলিংক ব্যবহার করুন যার উল্লিখিত 32k সীমা নেই। তারপরে অ্যাপ্লিকেশনটি ঠিক করার জন্য আপনার কাছে প্রচুর সময় ...


0

কেন টাইমস্ট্যাম্প পদ্ধতির ব্যবহার করবেন না এবং তারপরে একটি ওভারফ্লো বিকল্প রয়েছে।

উদাহরণ স্বরূপ

সুতরাং যাক আপনার টাইমস্ট্যাম্পটি হল: 1366587600

শেষ 2 সংখ্যা ছাড়ুন (অন্যথায় এটি কিছুটা হাস্যকর হয়ে যায়)। স্ট্যাম্পটিকে 4 টি সেটে আলাদা করুন (ডিরেক্টরি গণনাটি 9999-এর বেশি না পৌঁছানো উচিত - আপনি চাইলে এটি আলাদাভাবে আলাদা করতে পারেন)।

এটি আপনাকে এই জাতীয় কিছু দিয়ে ছেড়ে দেবে:

/files/1366/5876/

তারপরে আপলোড করার আগে ডিরের মধ্যে পরিমাণটিও পরীক্ষা করে দেখুন, যদি এটি প্রচুর পরিমাণে আপলোড (প্রতি 100 সেকেন্ডে 32000 +) পাচ্ছে, তবে দ্বিতীয়টি বা কোনও চিঠির সাহায্যে ডিরেক্টরিটি পুনরায় করুন, উদাহরণস্বরূপ:

/files/1366/5876/a/file.txt

অথবা

/files/1366/5876/00/file.txt

তারপরে টাইমস্ট্যাম্প + চিঠি বা পুরো পাথ কোডটি ব্যবহারকারীর সাথে একটি ডিবিতে লগ ইন করুন এবং আপনাকে সেট করা উচিত।

প্যাথস্ট্যাম্প: 1366587600 বা 13665876a (যদি আপনার চিঠিগুলি ব্যবহার করা হয়)।

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


0

প্যারেন্ট ফোল্ডারে আপনি (বা ক্যান) কত সর্বাধিক সাবডিরেক্টরিগুলি চান তা সিদ্ধান্ত নেওয়ার পরামর্শ দেব

তারপরে আপনাকে আপনার ব্যবহারকারী আইডি রূপান্তর করতে হবে যাতে তারা 1 থেকে শুরু করে।

তারপরে আপনি এটি করতে পারেন: modulo = currentId % numberOfSubdirectories

moduloএখন আপনার উপ-ডিরেক্টরি নম্বর থাকবে যা numberOfSubdirectoriesআপনি চয়ন করেছেন এর চেয়ে বড় আর হবে না ।

আপনি মডুলো দিয়ে যা চান তা করুন, হ্যাশ করুন, উদাহরণস্বরূপ।

এছাড়াও এইভাবে উপ-ডিরেক্টরিগুলি রৈখিকভাবে পূরণ করা হবে।

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