ما مقدار الذاكرة التي يجب أن تكون قادرًا على تخصيصها؟

StackOverflow https://stackoverflow.com/questions/1034045

سؤال

خلفية:أنا أكتب برنامج C++ يعمل مع كميات كبيرة من البيانات الجغرافية، وأرغب في تحميل أجزاء كبيرة لمعالجتها دفعة واحدة.أنا مقيد بالعمل مع تطبيق تم تجميعه لأجهزة 32 بت.الجهاز الذي أختبره يعمل بنظام تشغيل 64 بت (Windows 7) ويحتوي على 6 غيغابايت من ذاكرة الوصول العشوائي.باستخدام MS VS 2008.

لدي الكود التالي:

byte* pTempBuffer2[3];
try
{
    //size_t nBufSize = nBandBytes*m_nBandCount;
    pTempBuffer2[0] = new byte[nBandBytes];
    pTempBuffer2[1] = new byte[nBandBytes];
    pTempBuffer2[2] = new byte[nBandBytes];
}
catch (std::bad_alloc)
{
    // If we didn't get the memory just don't buffer and we will get data one
    // piece at a time.
    return;
}

كنت آمل أن أتمكن من تخصيص الذاكرة حتى يصل التطبيق إلى حد 4 غيغابايت وهو معالجة 32 بت.ومع ذلك، عندما يكون nBandBytes هو 466,560,000، فإن الرميات الجديدة std::bad_alloc في المحاولة الثانية.في هذه المرحلة، قيمة مجموعة العمل (الذاكرة) للعملية هي 665,232 كيلو، لذا، لا يبدو أنني قادر على تخصيص حتى جزء واحد من الذاكرة.

لقد تمت الإشارة إلى حد 2 جيجا بايت للتطبيقات في نظام التشغيل Windows 32 بت والذي يمكن تمديده إلى 3 جيجا بايت باستخدام المفتاح /3 جيجا بايت لنظام التشغيل Win32.وهذه نصيحة جيدة في ظل تلك البيئة، ولكنها ليست ذات صلة بهذه الحالة.

ما مقدار الذاكرة التي يجب أن تكون قادرًا على تخصيصها لنظام التشغيل 64 بت مع تطبيق 32 بت؟

هل كانت مفيدة؟

المحلول

بقدر ما يريد نظام التشغيل أن يمنحك.افتراضيًا، يتيح Windows لعملية 32 بت الحصول على 2 جيجابايت من مساحة العنوان.وهذا مقسم إلى عدة أجزاء.يتم تخصيص منطقة واحدة للمكدس، وأخرى لكل ملف قابل للتنفيذ وملف dll الذي تم تحميله.كل ما تبقى يمكن تخصيصه ديناميكيًا، لكن ليس هناك ما يضمن أنه سيكون جزءًا كبيرًا متجاورًا.قد تكون عدة أجزاء أصغر يبلغ حجم كل منها بضع مئات من ميغابايت.

إذا قمت بالتجميع باستخدام علامة LargeAddressAware، فسيسمح لك Windows 64 بت باستخدام مساحة العنوان الكاملة البالغة 4 جيجابايت، وهو ما من شأنه أن يساعد قليلاً، ولكن بشكل عام،

  • لا يجب أن تفترض أن الذاكرة المتوفرة متجاورة.يجب أن تكون قادرًا على العمل مع عدة تخصيصات أصغر بدلاً من عدد قليل من المخصصات الكبيرة
  • يجب عليك تجميعه كتطبيق 64 بت إذا كنت بحاجة إلى مساحة كبيرة من الذاكرة.

نصائح أخرى

وعلى ويندوز 32 بت، عملية طبيعية يمكن أن تأخذ 2 GB كحد أقصى، ولكن مع <لأ href = "http://technet.microsoft.com/en-us/library/bb124810.aspx" يختلط = "نوفولو noreferrer "> / 3GB التبديل يمكن أن تصل إلى 3 غيغابايت (ويندوز 2003).

ولكن في حالتك أعتقد أنك تخصيص الذاكرة القريبة، وهكذا حدث الاستثناء.

ويمكنك تخصيص قدر الذاكرة كملف الصفحة الخاصة بك وسوف تتيح لك - حتى من دون التبديل / 3GB، يمكنك تخصيص 4GB من الذاكرة دون صعوبة كبيرة.

ومقروءة على هذه المقالة لمحة جيدة عن كيفية التفكير في الذاكرة الفعلية، الذاكرة الافتراضية، ومساحة عنوان (كل ثلاثة أشياء مختلفة). باختصار، لديك بالضبط قدر الذاكرة الفعلية لديك ذاكرة الوصول العشوائي، ولكن التطبيق لديه حقا أي تفاعل مع أن الذاكرة الفعلية على الإطلاق - انها مجرد مكان مناسب لتخزين البيانات التي في الذاكرة الظاهرية. الذاكرة الظاهرية محدودة بسبب حجم ملف ترحيل الصفحات الخاصة بك، وكمية يمكن استخدام التطبيق الخاص بك محدودة بسبب كيفية استخدام الكثير من التطبيقات الأخرى (على الرغم من أنك يمكن تخصيص أكثر، مما يوفر لك لا فعلا استخدامها). مساحة عنوانك في العالم 32 بت 4GB. ومن بين هؤلاء، يتم تخصيص 2 GB إلى النواة (أو 1GB إذا كنت تستخدم التبديل / 3BG). من 2GB التي تم تركها، وبعض يجري ليتم استخدامها من قبل الكدسة، وبعض من البرنامج الذي تقوم بتشغيله حاليا، (وجميع دلس، الخ ..). انها تسير للحصول على مجزأة، وأنت ذاهب فقط لتكون قادرة على الحصول على الكثير من الفضاء متجاورة - وهذا هو المكان الذي تخصيص الخاص بك هو الفشل. ولكن منذ أن مساحة العنوان هو مجرد وسيلة مريحة للوصول إلى الذاكرة الظاهرية التي خصصت لك، فمن الممكن لتخصيص المزيد من الذاكرة، وجلب قطع منه إلى الفضاء عنوانك قليلة في وقت واحد.

ريمون تشن ديه مثال لكيفية تخصيص 4GB من الذاكرة وخريطة جزء منه في جزء من مساحة العنوان الخاص بك.

وتحت ويندوز 32 بت، أقصى allocatable هو 16TB و256TB في 64 بت ويندوز.

وإذا كنت حقا في كيفية عمل إدارة الذاكرة في ويندوز، وقراءة هذه المقالة .

وخلال المشروع ElephantsDream كان مؤسسة خلاط مع خلاط 3D مشاكل مماثلة (وإن على نظام التشغيل Mac). لا يمكن أن تشمل على الرابط ولكن جوجل: blender3d مشكلة تخصيص الذاكرة وسيكون أول بند

والحل تشارك تعيين ملف. لم أحاول ذلك بنفسي ولكن يمكنك أن تقرأ على أنها هنا: <لأ href = "http://msdn.microsoft.com/en-us/library/aa366556(VS.85).aspx" يختلط = "نوفولو noreferrer "> http://msdn.microsoft.com/en-us/library/aa366556 (VS.85) .aspx اتصال

ومع nBandBytes في 466560000، تحاول تخصيص 1.4 GB. والتطبيق 32 بت وعادة فقط الحصول على 2 غيغابايت من الذاكرة (أكثر إذا كنت التمهيد مع / 3GB ويتم وضع علامة للتنفيذ كمساحة عنوان كبير على علم). قد يكون من الصعب أن نجد أن العديد من كتل من مساحة العنوان متجاورة لديك مساحات كبيرة من الذاكرة.

إذا كنت تريد تخصيص غيغابايت من الذاكرة على نظام تشغيل 64 بت، استخدام عملية 64-بت.

ويجب أن تكون قادرة على تخصيص ما مجموعه نحو 2GB لكل عملية. هذه المقالة (PDF) ويوضح التفاصيل. ومع ذلك، وربما لن تكون قادرة على الحصول على واحد، كتلة متجاورة حتى أنها قريبة من تلك الكبيرة.

وحتى لو كنت تخصص في قطع أصغر، لا يمكن الحصول على الذاكرة التي تحتاج إليها، خصوصا إذا كان البرنامج المحيطة ديه السلوك الذاكرة لا يمكن التنبؤ بها، أو إذا كنت تحتاج إلى تشغيل على أنظمة تشغيل مختلفة. في تجربتي، ومساحة كومة على عملية 32 بت قبعات عند حوالي 1.2GB.

وفي هذا المبلغ من الذاكرة، أود أن أوصي يدويا الكتابة إلى القرص. التفاف المصفوفات الخاصة بك في الفئة التي تدير الذاكرة ويكتب إلى ملفات مؤقتة عند الضرورة. نأمل خصائص البرنامج هي تلك التي يمكن تخزين فعال أجزاء من تلك البيانات دون ضرب القرص أكثر من اللازم.

سسنترنلس VMMap تعتبر كبيرة بالنسبة التحقيق تجزئة مساحة العنوان الظاهرية، التي ربما تحد من مقدار الذاكرة متجاورة يمكنك تخصيص. أوصي وضع فوقه لعرض مساحة حرة، ثم الفرز حسب حجم للعثور على أكبر المناطق الحرة، ثم الفرز حسب عنوان لمعرفة ما يفصل بين أكبر المناطق الحرة (دلس ربما المعاد تقديرها، مناطق الذاكرة المشتركة، أو أكوام أخرى).

وتجنب غاية مخصصات متجاورة كبيرة وربما للأفضل، والبعض الآخر قد اقترح.

ووضع LARGE_ADDRESS_AWARE=YES (كما jalf المقترح) هو جيد، طالما المكتبات أن التطبيق الخاص بك يعتمد على متوافقة معها. إذا قمت بذلك، يجب اختبار التعليمات البرمجية الخاصة بك مع AllocationPreference مفتاح التسجيل تعيين لتمكين أعلى إلى أسفل تخصيص العنوان الظاهرية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top