ওভারফ্লো বাছাই পর্যায়ের বাফার ডেটা ব্যবহার অভ্যন্তরীণ সীমা অতিক্রম করে


85

কোড ব্যবহার করে:

all_reviews = db_handle.find().sort('reviewDate', pymongo.ASCENDING)
print all_reviews.count()

print all_reviews[0]
print all_reviews[2000000]

গণনা প্রিন্ট 2043484, এবং এটি মুদ্রণ all_reviews[0]

তবে মুদ্রণের সময় all_reviews[2000000], আমি ত্রুটিটি পাই:

pymongo.erferences.OperationFailure: ডাটাবেস ত্রুটি: রানার ত্রুটি: ওভারফ্লো বাছাই পর্যায়ের বাফার ডেটা ব্যবহার 33554495 বাইটের অভ্যন্তরীণ সীমা ছাড়িয়েছে 33554432 বাইট

আমি কীভাবে এটি পরিচালনা করব?

উত্তর:


119

আপনি একটি মেমোরি বাছাই করে 32MB সীমাতে চলেছেন:

https://docs.mongodb.com/manual/references/limits/#Sort-Oretions

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


7
একটি সূচক ঘোষণা করা আরও ভাল যাতে আপনার র‌্যামে সাজানোর দরকার নেই: দ্রুত এবং আরও নির্ভরযোগ্য, সম্ভাব্য সীমাহীনের চেয়ে সীমাবদ্ধ র‌্যাম ব্যবহার। যদি আপনি জেদ করেন, আপনার "সন্ধান করুন" কে একত্রিকরণে পরিণত করুন (যা সাজানোর জন্য 100 এমবি র‌্যাম ব্যবহার করতে পারে) এবং অনুমতিডিস্কউস সেট করুন: একত্রীকরণ কাঠামোটি যদি র‌্যামের 100MB ছাড়িয়ে যায় তবে ডিস্কে ছড়িয়ে দিতে বলা ঠিক। কেবলমাত্র উপযুক্ত সূচক ঘোষণার তুলনায় তীব্র পারফরম্যান্স জরিমানার প্রত্যাশা করুন। ডকস.মোংডব.অর্গ
এ জেসি জিরিয়ু ডেভিস

32
আসলে, এটি পরিবর্তন করা যেতে পারে। আপনি এই কমান্ড প্রয়োগ করা প্রয়োজন: db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})। সূত্র: Askubuntu.com/questions/501937/…
কুমারহর্শ

6
মংগুজ ব্যবহারকারীদের জন্য সূচক স্থাপনের বিষয়টি লক্ষ্য করা ভাল: আপনার স্কিমার প্রপ এ সত্যটি এই সমস্যার সমাধান করবে ... মংগুজ আপনার সমস্ত স্কিমার মধ্য দিয়ে যাবে এবং অ্যাপ্লিকেশনটি শুরুর আগে ক্ষেত্রগুলি সত্যিকারের সূচীতে রয়েছে তা নিশ্চিত করবে ... যদি না হয় আপনি এই আচরণটি mySchema.set ('অটোআইডেক্স', মিথ্যা) দিয়ে বন্ধ করেছেন;
বেনিয়ামিন কনান্ট

4
আমি বাছাইয়ের ক্ষেত্রে একটি সূচক তৈরি করেছি তবে তবুও এটি আমাকে "সর্বাধিক 33554432 বাইট র‌্যামের চেয়ে বেশি ব্যবহার করেছে" প্রদানের ত্রুটিটি হতে পারে কারণ আমি বাছাইয়ের আগে ম্যাচ অপারেশন প্রয়োগ করছি এবং মঙ্গো ডক অনুসারে আপনি যদি সাজানোর আগে ম্যাচ ব্যবহার করেন তবে ক্রিয়াকলাপটি সূচকে অবহেলা করবে এবং সমস্ত মিলে যাওয়া রেকর্ডের চেয়ে মেমরি বাছাই করে।
অমল সূর্যাবনশি

11
এটি যদি স্বীকৃত উত্তর হয় তবে এটিতে কীভাবে একটি সূচি যুক্ত করতে হবে তার তথ্য অন্তর্ভুক্ত করা উচিত।
ফিলিপ লুডভিগ

46

বলেছেন হিসাবে kumar_harshমন্তব্য বিভাগে, আমি অন্য বিন্দু যোগ করতে চাই।

আপনি adminডাটাবেসের মাধ্যমে নীচের কমান্ডটি ব্যবহার করে বর্তমান বাফার ব্যবহার দেখতে পারেন :

> use admin
switched to db admin
> db.runCommand( { getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1 } )
{ "internalQueryExecMaxBlockingSortBytes" : 33554432, "ok" : 1 }

এর ডিফল্ট মান 32 এমবি (33554432 বাইট) রয়েছে this এক্ষেত্রে আপনি বাফার ডেটা সংক্ষিপ্ত করে চলেছেন যাতে আপনি নিজের নির্ধারিত অনুকূল মানের সাথে বাফার সীমা বাড়াতে পারেন, উদাহরণস্বরূপ নীচের মত 50 এমবি:

>  db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes:50151432})
{ "was" : 33554432, "ok" : 1 }

আমরা এই সীমাটি স্থায়ীভাবে মংডোব কনফিগারেশন ফাইলে নীচের প্যারামিটার দ্বারা স্থির করতে পারি:

setParameter=internalQueryExecMaxBlockingSortBytes=309715200

আশাকরি এটা সাহায্য করবে !!!

Note: এই কমান্ডগুলি 3.0+ সংস্করণের পরে কেবল সমর্থন করে


এই সীমাটি স্থায়ীভাবে কনফিগার ফাইলে সেট করার উপায় কী? আমার কাছে 1 টিবি মেমরির মেশিন রয়েছে যা মঙ্গোকে উত্সর্গ করা হয় এবং আমি এটি স্থায়ীভাবে ক্র্যাঙ্ক করতে চাই।
সামান্থা অ্যাটকিন্স

@ সামান্থা অ্যাটকিনস আমি কনফিগার ফাইলে স্থায়ীভাবে সেট করার জন্য উত্তর আপডেট করেছি।
জেরি

@ JERRY যেখানে রেল স্থায়ীভাবে সেট করতে হবে। পাঁচটি / মঙ্গয়েড.আইএমএল?
প্রদীপ কুল

আমি এটি খুঁজে পেয়েছি। আমার টার্মিনালটিতে দৌড়ুন: মঙ্গোদ এবং ম্যানুয়াল zocada.com/setting-mongodb-users-beginners-guide
প্রদীপ কুল

24

সূচকের সাথে সমাধান করা

db_handle.ensure_index([("reviewDate", pymongo.ASCENDING)])

কোনও স্পার্স সূচক ব্যবহার না করার বিষয়ে নিশ্চিত হন, আপনি প্রতিটি নথিতে বাছাই করলে সেগুলি উপেক্ষা করা হবে
চার্লি কোজা

15

যদি আপনি কোনও সূচক তৈরি করা এড়াতে চান (যেমন আপনি কেবল ডেটা অন্বেষণের জন্য দ্রুত এবং ময়লা পরীক্ষা করতে চান), আপনি ডিস্কের ব্যবহার সহ একত্রি ব্যবহার করতে পারেন:

all_reviews = db_handle.aggregate([{$sort: {'reviewDate': 1}}], {allowDiskUse: true})

(যদিও পিমোঙ্গো এ এটি করবেন তা নিশ্চিত নন)।


পাইমঙ্গো হবে db_handle.aggregate(pipe, allowDiskUse=True)। আরও তথ্যের জন্য এই প্রশ্নটি দেখুন !
জেনারিতো

3

সূচকের জন্য জাভাস্ক্রিপ্ট এপিআই সিনট্যাক্স:

db_handle.ensureIndex({executedDate: 1})

2

আমার ক্ষেত্রে কোডে নেসারি সূচকগুলি ঠিক করা এবং সেগুলি পুনরায় তৈরি করা দরকার ছিল:

rake db:mongoid:create_indexes RAILS_ENV=production

যখন ক্ষেত্রের প্রয়োজনীয় সূচক থাকে তখন মেমরির ওভারফ্লো হয় না।

পিএস এর আগে দীর্ঘ সূচকগুলি তৈরি করার সময় আমাকে ত্রুটিগুলি অক্ষম করতে হয়েছিল:

# mongo
MongoDB shell version: 2.6.12
connecting to: test
> db.getSiblingDB('admin').runCommand( { setParameter: 1, failIndexKeyTooLong: false } )

এছাড়াও প্রয়োজন হতে পারে reIndex:

# mongo
MongoDB shell version: 2.6.12
connecting to: test
> use your_db
switched to db your_db
> db.getCollectionNames().forEach( function(collection){ db[collection].reIndex() } )
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.