.NET আউট অফ মেমোরি এক্সেপশন - 1.3 জিবি ব্যবহৃত তবে 16 জিবি ইনস্টল করা আছে


91

অ্যাপ্লিকেশনটির জন্য মেমরির ব্যবহার প্রায় 1.3 গিগাবাইট ছাড়িয়ে গেলে আমি আমার সি # অ্যাপ্লিকেশনটিতে একটি আউট অফ মেমরি ব্যতিক্রম পাচ্ছি।

আমি 3 জিবি মেমরির 32-বিট মেশিনে একই সমস্যাটি পেয়েছিলাম এবং এটি তখন ফিরে এসেছিল তবে এখন আমি উচ্চ-প্রান্তের মাদারবোর্ড এবং র‌্যামের সাথে তবে মেমরির আউট অফ মেমোরি দিয়ে 16 গিগাবাইট মেমরির সাহায্যে হার্ডওয়্যারটিকে একটি 64-বিট মেশিনে আপগ্রেড করেছি I ব্যতিক্রম এখনও 1.3 গিগাবাইট পরে ঘটে!

আমি জানি যে 2 গিগাবাইটের বেশি কোনও একক অবজেক্ট নেই এবং 1.3 যাইহোক 2 জিবি কম নয়, সুতরাং একক বস্তুতে অন্তর্নির্মিত এমএস 2 জিবি সীমাতে সমস্যা হওয়ার সম্ভাবনা নেই ...

দেখে মনে হচ্ছে কোনও অ্যাপ্লিকেশন নির্দিষ্ট মেমোরি ব্যবহারের প্রান্তে পৌঁছে গেলে কোনও ধরণের উইন্ডোজ কিল-স্যুইচ রয়েছে ... তবে এটি কনফিগার করার কোনও উপায় থাকতে হবে সম্ভবত রেজিস্ট্রিতে?

যে কোন সাহায্য সাদরে গৃহীত হবে!


9
আপনার ওএস 64 বিটটিও কি?
fge

9
এমনকি যদি আপনার ওএস 64৪ বিট হয় তবে নিশ্চিত হয়ে নিন যে আপনার প্রক্রিয়াটিও bit৪ বিবিট (বা যেকোনো সিপিইউ)
নোলিচ

উত্তর:


90

আপনি একই লক্ষ্য স্থাপত্যে সংকলন না হওয়া পর্যন্ত কোনও পার্থক্য নেই । আমি মনে করি আপনি 32উভয় ক্ষেত্রে বিট স্থাপত্যের জন্য সংকলন করছেন ।

এটি উল্লেখ করার মতো যে OutOfMemoryExceptionআপনি যদি স্থাপত্য এবং বিট উভয় 2GBক্ষেত্রে সিএলআর (বলুন List<T>) এর একটি একক সংগ্রহের দ্বারা বরাদ্দকৃত স্মৃতি পেয়ে থাকেন তবে এটি উত্থাপিতও হতে পারে ।3264

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


8
আর কি হবে?
dtb

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

4
আমি জানতাম যে :) - ধন্যবাদ টিগ্রান, আমি x64 এ সমাধানটি পুনর্নির্মাণ করেছি এবং ব্যতিক্রমটি চলে গেল।
পেসম্যান

63

ইতিমধ্যে উল্লিখিত হিসাবে, x64 এ অ্যাপ্লিকেশন সংকলন আপনাকে অনেক বেশি উপলভ্য মেমরি দেয়।

তবে ক্ষেত্রে অবশ্যই একটি x86 এ অ্যাপ তৈরি করতে হবে, মেমরির সীমা 1,2GB থেকে 4GB (যা 32 বিট প্রক্রিয়াগুলির আসল সীমা) বাড়ানোর উপায় রয়েছে:

ভিজ্যুয়াল স্টুডিও ইনস্টলেশন ডিরেক্টরিতে ভিসি / বিন ফোল্ডারে অবশ্যই একটি editbin.exeফাইল থাকতে হবে । সুতরাং আমার ডিফল্ট ইনস্টলেশন আমি এটি অধীন খুঁজে

C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\editbin.exe

প্রোগ্রামটি কাজ করার জন্য, আপনাকে vcvars32.batপ্রথমে একই ডিরেক্টরিতে চালিত করতে হবে । তখন একটা

editbin /LARGEADDRESSAWARE <your compiled exe file>

আপনার প্রোগ্রামটি 4 জিবি র‌্যাম ব্যবহার করতে দেওয়া যথেষ্ট। <your compiled exe file>উদাহরণস্বরূপ, আপনার প্রকল্পটি সংকলনের সময় ভিএস উত্পাদিত।

আপনি যদি প্রতিবার আপনার প্রকল্পটি সংকলন করেন তবে আপনি যদি এই আচরণটি স্বয়ংক্রিয় করতে চান তবে নির্বাহিত প্রকল্পের জন্য নিম্নলিখিত পোস্ট-বিল্ড ইভেন্টটি ব্যবহার করুন:

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

সিডিনোট: devenv.exeভিজ্যুয়াল স্টুডিওতেও 1.2 গিগাবাইটের পরিবর্তে 4 জিবি র‌্যাম ব্যবহার করতে দেওয়া (তবে প্রথমটি পুরানোটিকে ব্যাকআপ করুন devenv.exe) দিয়ে একই কাজ করা যেতে পারে ।


অনেক ধন্যবাদ. এটি আমার পক্ষে কাজ করে। তবে মেমরির সীমা 4 গিগাবাইটে বাড়ানোর পরে কি আমাদের কোনও চিহ্নিত সমস্যা আছে?
ম্যাভেরিক

28

এটি উল্লেখ করার মতো যে 'যে কোনও সিপিইউ' সংকলনের জন্য ডিফল্ট এখন 'পছন্দসই 32bit' চেক বাক্সটি পরীক্ষা করে। যেকোন সিপিইউতে সেট করা হচ্ছে, 16 জিবি র‌্যামের একটি 64 বিট ওএসে এখনও যদি চেক করা হয় তবে 2 জিবিতে মেমরির ব্যতিক্রম ছাড়তে পারে।

Prefer32BitCheckBox


4
এটি আমার স্মৃতি সমস্যার থেকে একেবারে সমাধান করেছে এবং আমাদের এক হতাশার হাত থেকে বাঁচিয়েছে
RSSM

2

দেখে মনে হচ্ছে আপনার একটি 64 বিট খিলান আছে, জরিমানা - তবে .NET রানটাইম এবং / অথবা উইন্ডোজের 32 বিট সংস্করণটির 32 বিট সংস্করণ।

এবং এর মতো, আপনার প্রক্রিয়াটির জন্য উপলব্ধ ঠিকানা স্থানটি এখনও একই, এটি আপনার পূর্ববর্তী সেটআপ থেকে পরিবর্তিত হয়নি।

একটি 64 বিবিটি ওএস এবং একটি 64 বিট। নেট সংস্করণ;) দুটিতে আপগ্রেড করুন


1

আপনার অ্যাপ্লিকেশনটি কি 64 বা 32 বিট প্রক্রিয়া হিসাবে চলছে? আপনি এটি টাস্ক ম্যানেজারে পরীক্ষা করতে পারেন।

এটি হতে পারে, এটি 32 বিট হিসাবে চলমান, যদিও পুরো সিস্টেমটি 64 বাইটে চলছে।

যদি 32 বিট, একটি তৃতীয় পক্ষের গ্রন্থাগার এটির কারণ হতে পারে। তবে প্রথমে নিশ্চিত হয়ে নিন যে আপনার অ্যাপ্লিকেশনটি "যে কোনও সিপিইউ" এর জন্য সংকলন করছে, মন্তব্যগুলিতে বলা হয়েছে।


0

আপনার যদি 32-বিট উইন্ডোজ থাকে তবে এই পদ্ধতিটি সেটিংস অনুসরণ না করে কাজ করছে না।

  1. প্রম্পট চালান cmd.exe (গুরুত্বপূর্ণ: প্রশাসক হিসাবে চালান)
  2. bcdedit.exe টাইপ করুন এবং রান করুন
  3. "বর্ধনকারী" পরমগুলি দেখুন এবং নীচের বিবৃতিটি লেখার পরে আর নেই
  4. বিসিডিডিট / সেট বৃদ্ধিউসারভা 3072
  5. এবং আবার পদক্ষেপ 2 এবং প্যারামগুলি পরীক্ষা করুন

আমরা এই সেটিংসটি যুক্ত করেছি এবং এই ব্লকটি শুরু হয়েছে।

if exist "$(DevEnvDir)..\tools\vsvars32.bat" (
   call "$(DevEnvDir)..\tools\vsvars32.bat"
   editbin /largeaddressaware "$(TargetPath)"
)

আরও তথ্য - কমান্ড increaseuserva: https : //docs.mic Microsoft.com/en-us/windows-hardware/drivers/devtest/bcdedit--set

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