যখন প্রচুর মেমরি মুক্ত নেই তখন 'System.OutOfMemoryException' ফেলে দেওয়া হয়েছিল


95

এটি আমার কোড:

int size = 100000000;
double sizeInMegabytes = (size * 8.0) / 1024.0 / 1024.0; //762 mb
double[] randomNumbers = new double[size];

ব্যতিক্রম: 'System.OutOfMemoryException' টাইপের ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল।

আমি এই মেশিনে 4 জিবি মেমরি পেয়েছি 2.5 জিবি বিনামূল্যে যখন আমি এই চলমানটি শুরু করি, 100000000 এলোমেলো সংখ্যার 762mb হ্যান্ডেল করার জন্য পিসিতে স্পষ্টতই যথেষ্ট জায়গা রয়েছে। উপলব্ধ মেমরির ভিত্তিতে আমার যথাসম্ভব এলোমেলো সংখ্যা সংরক্ষণ করতে হবে। আমি যখন প্রযোজনায় যাব তখন সেখানে বাক্সে 12 গিগাবাইট থাকবে এবং আমি এটি ব্যবহার করতে চাই।

সিএলআর কি শুরু করতে আমাকে ডিফল্ট সর্বাধিক মেমরির প্রতিবন্ধক করে? এবং আমি কীভাবে আরও অনুরোধ করব?

হালনাগাদ

আমি ভেবেছিলাম এটিকে ছোট ছোট ভাণ্ডারে ভাঙ্গা এবং ক্রমান্বয়ে আমার মেমরির প্রয়োজনীয়তা যুক্ত করা যদি সমস্যাটি মেমরি বিভাজনের কারণে হয় তবে আমি ব্লকসাইজে টুইঙ্কিং যাই করুক না কেন 256mb এর মোট অ্যারেলিস্টের আকারটি পাব না

private static IRandomGenerator rnd = new MersenneTwister();
private static IDistribution dist = new DiscreteNormalDistribution(1048576);
private static List<double> ndRandomNumbers = new List<double>();

private static void AddNDRandomNumbers(int numberOfRandomNumbers) {
    for (int i = 0; i < numberOfRandomNumbers; i++) {
      ndRandomNumbers.Add(dist.ICDF(rnd.nextUniform()));                
  }
}

আমার মূল পদ্ধতি থেকে:

int blockSize = 1000000;

while (true) {
  try
  {
    AddNDRandomNumbers(blockSize);                    
  }
  catch (System.OutOfMemoryException ex)
  {
    break;
  }
}            
double arrayTotalSizeInMegabytes = (ndRandomNumbers.Count * 8.0) / 1024.0 / 1024.0;

6
আমি আপনার অ্যাপ্লিকেশনটি পুনর্নির্মাণের পরামর্শ দেব যাতে আপনাকে এত স্মৃতি ব্যবহার করতে না হয়। আপনি কী করছেন যে আপনার একবারে স্মরণে একশ মিলিয়ন সংখ্যার প্রয়োজন?
এরিক লিপার্ট

4
আপনি নিজের পেজফাইলে বা সেভাবে নির্বোধ কিছু অক্ষম করেননি, তাই না?
জলফ

@ এরিকলিপার্ট, পি ভার্সেস এনপি সমস্যা নিয়ে কাজ করার সময় আমি এটিকে চালিয়ে যাচ্ছি ( ক্লাটিম্যাথ.অর্গ / মিলিলিয়াম-প্রব্লেমস / পিপিওভিস- এনপি- প্রব্লেম )। কাজের স্মৃতি ব্যবহার কমাতে আপনার কাছে কি কোনও পরামর্শ আছে? (উদাহরণস্বরূপ, হার্ড ডিস্কে ডেটা কিছু পরিমাণে সিরিয়ালিয়াল করা এবং সংরক্ষণ করা, সি ++ ডাটা টাইপ ইত্যাদি ব্যবহার করে)
ডেভিনবস্ট

@ বসিট এটি একটি প্রশ্নোত্তর সাইট। আপনার যদি প্রকৃত কোড সম্পর্কে নির্দিষ্ট প্রযুক্তিগত প্রশ্ন থাকে তবে এটি একটি প্রশ্ন হিসাবে পোস্ট করুন।
এরিক লিপার্ট

আপনার মন্তব্যে পি বনাম এনপি সমস্যার জন্য লিঙ্কটি ক্লিক করুন আর বৈধ নয়।
আরবিটি

উত্তর:


145

আপনি এটি পড়তে চাইতে পারেন: " " মেমরির বাইরে "শারীরিক স্মৃতিতে রেফারেন্স দেয় না " এরিক লিপার্ট লিখেছেন।

সংক্ষেপে, এবং খুব সরল, "মেমরির আউট" এর সত্যিকারের অর্থ এই নয় যে উপলব্ধ মেমরির পরিমাণ খুব কম। সর্বাধিক সাধারণ কারণ হ'ল বর্তমান ঠিকানার জায়গার মধ্যে, মেমরির কোনও সংলগ্ন অংশ নেই যা প্রয়োজনীয় বরাদ্দটি পরিবেশন করতে যথেষ্ট বড় is আপনার যদি প্রতিটি 4 এমবি বড় 100 টি ব্লক থাকে তবে আপনার যখন 5 এমবি ব্লকের প্রয়োজন হয় তখন এটি আপনাকে সাহায্য করবে না।

গুরুত্বপূর্ণ দিক:

  • আমরা যে ডেটা স্টোরেজকে "প্রসেস মেমরি" বলি তা আমার মতে ডিস্কে একটি বৃহত ফাইল হিসাবে ভিজ্যুয়ালাইজ করা হয় ।
  • র‌্যামকে কেবলমাত্র পারফরম্যান্স অপটিমাইজেশন হিসাবে দেখা যায়
  • আপনার প্রোগ্রামটি যে পরিমাণ ভার্চুয়াল মেমরি গ্রহণ করে তা এর কার্যকারিতার সাথে অত্যন্ত প্রাসঙ্গিক নয়
  • "র্যামের বাইরে চলে যাওয়া" খুব কমই "মেমরির বাইরে" ত্রুটির ফলস্বরূপ। একটি ত্রুটির পরিবর্তে, এটি খারাপ কার্য সম্পাদনের ফলাফল দেয় কারণ স্টোরেজটি আসলে ডিস্কে থাকা সত্যতার পুরো খরচ হঠাৎ প্রাসঙ্গিক হয়ে যায়।

"আপনার যদি 100 টি ব্লক থাকে, প্রতিটি 4 এমবি বড় হয়, যখন আপনার একটি 5 এমবি ব্লকের প্রয়োজন হবে তখন আপনাকে সাহায্য করবে না" - আমি মনে করি এটি একটি ছোট সংশোধন দিয়ে আরও ভালভাবে চিহ্নিত করা যেতে পারে: "যদি আপনার 100 টি গর্ত থাকে "
অফিআরডি

31

আপনি একটি 64-বিট প্রক্রিয়া তৈরি করছেন এবং 32-বিট নয়, যা ভিজ্যুয়াল স্টুডিওর ডিফল্ট সংকলন মোড Check এটি করতে, আপনার প্রকল্পে ডান ক্লিক করুন, সম্পত্তি -> বিল্ড -> প্ল্যাটফর্ম লক্ষ্য: x64। যে কোনও 32-বিট প্রক্রিয়া হিসাবে, 32-বিটে সংকলিত ভিজ্যুয়াল স্টুডিও অ্যাপ্লিকেশনগুলিতে ভার্চুয়াল মেমরির সীমা 2GB থাকে।

-৪-বিট প্রক্রিয়াগুলির এই সীমাবদ্ধতা থাকে না, কারণ তারা 64৪-বিট পয়েন্টার ব্যবহার করে, তাই তাদের তাত্ত্বিক সর্বাধিক ঠিকানা স্থান (তাদের ভার্চুয়াল মেমরির আকার) 16 এক্সাবাইট (2 2 64)। বাস্তবে, উইন্ডোজ x64 প্রসেসগুলির ভার্চুয়াল মেমরিটিকে 8 টিবিতে সীমাবদ্ধ করে। মেমরি সীমা সমস্যার সমাধানটি তখন 64৪-বিটে সংকলন করা হয়।

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

<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>

তুমি আমাকে বাঁচালে. ধন্যবাদ!
টি জাদ আউক

25

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

  1. আপনি / 3 গিগাবাইটের সাথে কাজ করার চেষ্টা করতে পারেন (অন্যরা যেমন প্রস্তাব করেছিল)
  2. বা 64 বিট ওএসে স্যুইচ করুন।
  3. বা অ্যালগরিদমটি সংশোধন করুন এটির জন্য মেমরির একটি বড় অংশ প্রয়োজন হবে না। হতে পারে স্মৃতি কয়েক ছোট (তুলনামূলক) খণ্ড বরাদ্দ।

8

আপনি সম্ভবত বুঝতে পেরেছেন, সমস্যাটি হ'ল আপনি মেমরির একটি বৃহত সংলগ্ন ব্লক বরাদ্দ দেওয়ার চেষ্টা করছেন যা মেমরি বিভাজনের কারণে কাজ করে না। আপনি যা করছেন তা করার দরকার হলে আমি নিম্নলিখিতগুলি করব:

int sizeA = 10000,
    sizeB = 10000;
double sizeInMegabytes = (sizeA * sizeB * 8.0) / 1024.0 / 1024.0; //762 mb
double[][] randomNumbers = new double[sizeA][];
for (int i = 0; i < randomNumbers.Length; i++)
{
    randomNumbers[i] = new double[sizeB];
}

তারপরে, একটি নির্দিষ্ট সূচক পেতে আপনি ব্যবহার করবেন randomNumbers[i / sizeB][i % sizeB]

আর আপনি যদি সর্বদা মানগুলিতে অ্যাক্সেস করেন তবে অন্য বিকল্পটি বীজ নির্দিষ্ট করতে ওভারলোডড কনস্ট্রাক্টর ব্যবহার করতে পারে । এভাবে আপনি একটি আধা এলোমেলো নম্বর পেয়ে যাবেন (যেমন DateTime.Now.Ticks) এটি একটি ভেরিয়েবেলে সংরক্ষণ করবেন, তারপরে আপনি যখন তালিকার মধ্য দিয়ে যেতে শুরু করবেন তখন আপনি মূল বীজটি ব্যবহার করে একটি নতুন এলোমেলো উদাহরণ তৈরি করবেন:

private static int randSeed = (int)DateTime.Now.Ticks;  //Must stay the same unless you want to get different random numbers.
private static Random GetNewRandomIterator()
{
    return new Random(randSeed);
}

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

2 জিবি সীমাবদ্ধতার অর্থ এটি randomNumbers অবশ্যই 2 জিবি এর চেয়ে কম হওয়া উচিত। যেহেতু অ্যারেগুলি ক্লাস হয় এবং তাদের কিছুতে ওভারহেড থাকে সেগুলির অর্থ এটির একটি অ্যারে double2 ^ 31 এর পরে আরও ছোট হওয়া দরকার। আমি নিশ্চিত না যে 2 ^ 31 এর পরে দৈর্ঘ্য কতটা ছোট হবে, তবে একটি নেট নেট অ্যারের ওভারহেড? 12 - 16 বাইট নির্দেশ করে।

মেমরি বিভাজন এইচডিডি খণ্ডনের সাথে খুব মিল। আপনার কাছে অ্যাড্রেস স্পেসের 2 জিবি থাকতে পারে, তবে আপনি যখন অবজেক্ট তৈরি এবং ধ্বংস করবেন তখন মানগুলির মধ্যে ফাঁক থাকবে। যদি আপনার বৃহত অবজেক্টের জন্য এই ফাঁকগুলি খুব ছোট হয়, এবং অতিরিক্ত স্থানের জন্য অনুরোধ করা যায় না, তবে আপনি এটি পাবেনSystem.OutOfMemoryException। উদাহরণস্বরূপ, আপনি যদি 2 মিলিয়ন, 1024 বাইট অবজেক্ট তৈরি করেন তবে আপনি 1.9GB ব্যবহার করছেন। যদি আপনি ঠিকানাটি 3 এর একাধিক না হয়ে থাকে তবে আপনি .6GB মেমরি ব্যবহার করবেন তবে এটি 2024 বাইট ওপেন ব্লকগুলির মধ্যে ঠিকানা স্পেসে ছড়িয়ে দেওয়া হবে। আপনার যদি এমন কোনও বস্তু তৈরি করতে হয় যা .২ গিগাবাইট ছিল তবে আপনি এটি করতে সক্ষম হবেন না কারণ এটিতে ফিট করার মতো কোনও বৃহত ব্লক নেই এবং অতিরিক্ত স্থান পাওয়া যায় না (32 বিট পরিবেশ অনুমান করে)। এই সমস্যার সম্ভাব্য সমাধানগুলি হ'ল ছোট জিনিসগুলি ব্যবহার করা, মেমরিতে আপনি যে পরিমাণ ডেটা সঞ্চয় করেন তা হ্রাস করা বা মেমরি ম্যানেজমেন্ট অ্যালগরিদম ব্যবহার করে মেমরি বিভাজনকে সীমাবদ্ধ / প্রতিরোধ করতে। এটি লক্ষ করা উচিত যে আপনি যদি একটি বৃহত প্রোগ্রাম বিকাশ না করেন যা প্রচুর পরিমাণে মেমরি ব্যবহার করে তবে এটি কোনও সমস্যা হবে না। এছাড়াও,

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


এটি তখন দীর্ঘ প্রত্যাশিত ছিল। আশা করি এটি কাউকে সাহায্য করবে। আমি এটি পোস্ট করেছি কারণ আমার System.OutOfMemoryExceptionসিস্টেমে 2 জিবি স্টাফ থাকা সত্ত্বেও আমি 24 জিবি র‌্যাম সহ একটি সিস্টেমে একটি এক্স 6464 প্রোগ্রাম চালাচ্ছি।


"যেহেতু বেশিরভাগ প্রোগ্রামগুলি ওএস থেকে মেমরির কাজ করার অনুরোধ করে এবং ফাইল ম্যাপিংয়ের অনুরোধ করে না" - আপনি কি আরও সংস্থানটি আরও ব্যাখ্যা করে বলবেন? যখন প্রোগ্রামগুলিকে মেমরিতে থাকার জন্য তাদের কাজের সেটের প্রয়োজন হয় (এবং র‌্যাম আকারের দ্বারা সীমাবদ্ধ থাকে) বনাম যখন প্রোগ্রামগুলি ডিস্কে লিখতে পারে এবং
সংঘবদ্ধ

4
@ uMdRupert আমি যখন গবেষণা করেছি এবং এটি লিখেছি তখন কিছুক্ষণ হয়ে গেছে, তাই আমার কোনও অতিরিক্ত সংস্থান নেই। আপনাকে [CreateFileMapping ফাংশন] (পড়ার সুযোগ পাননি msdn.microsoft.com/en-us/library/windows/desktop/aa366537.aspx ) লিঙ্ক? আপনি পেজিং উপর পড়তে চাইতে পারেন ।
18:40

5

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

অনেক উইন্ডোজ ড্রাইভার এই বিকল্পটির সাথে পরীক্ষা করা হয় না, সুতরাং তাদের মধ্যে বেশ কয়েকটি ধারণা করে যে ব্যবহারকারী-মোড পয়েন্টারগুলি সর্বদা ঠিকানা জায়গার নীচে 2 জিবিতে নির্দেশ করে। যার অর্থ তারা / 3 জিবি দিয়ে ভয়াবহভাবে ভেঙে যেতে পারে।

তবে উইন্ডোজ সাধারণত ৩ জিবি ঠিকানা স্থানে ৩২-বিট প্রক্রিয়া সীমাবদ্ধ করে। তবে এর অর্থ এই নয় যে আপনি 2 জিবি বরাদ্দ করতে সক্ষম হবেন আশা করা উচিত!

ঠিকানা স্থানটি ইতিমধ্যে সমস্ত ধরণের বরাদ্দকৃত ডেটা দিয়ে আবদ্ধ। এখানে স্ট্যাক এবং সমস্ত অ্যাসেম্বলিগুলি লোড হওয়া, স্ট্যাটিক ভেরিয়েবলস এবং রয়েছে। এর কোনও গ্যারান্টি নেই যে এখানে 800 এমবি সংঘবদ্ধ অব্যক্ত মেমরি থাকবে।

2 400MB খণ্ড বরাদ্দ করা সম্ভবত আরও ভাল হবে। অথবা 4 200 এমবি খণ্ড। ক্ষুদ্রতর বরাদ্দগুলি একটি খণ্ডিত মেমরির জায়গার জন্য জায়গা খুঁজে পাওয়া অনেক সহজ।

যাইহোক, আপনি যদি এটি যাইহোক 12 জিবি মেশিনে স্থাপন করতে চলেছেন তবে আপনি এটি একটি 64-বিট অ্যাপ্লিকেশন হিসাবে চালাতে চাইবেন, যা সমস্ত সমস্যার সমাধান করা উচিত।


কাজটিকে ছোট ছোট ভাগে ভাগ করা আমার উপরের আপডেটটি দেখতে সহায়তা করবে বলে মনে হয় না।
m3ntat

4

32 থেকে 64 বিট পরিবর্তন করা আমার পক্ষে কাজ করেছে - আপনি যদি 64 বিট পিসিতে থাকেন এবং এটি পোর্ট করার দরকার নেই তবে চেষ্টা করে দেখার চেষ্টা করা উচিত।


2

আপনার যদি এত বড় কাঠামোর প্রয়োজন হয় তবে সম্ভবত আপনি মেমরি ম্যাপ করা ফাইলগুলি ব্যবহার করতে পারেন। এই নিবন্ধটি সহায়ক প্রমাণ করতে পারে: http://www.codeproject.com/KB/recips/MemoryMappedGenericArray.aspx

এলপি, দেজন


1

32 বিট উইন্ডোজ একটি 2 জিবি প্রক্রিয়া মেমরি সীমা আছে। অন্যরা উল্লিখিত / 3 গিগাবাইট বুট অপশনটি ওএস কার্নেল ব্যবহারের জন্য কেবল 1 জিবি অবশিষ্ট 3 জিবি তৈরি করবে। বাস্তবতাই যদি আপনি কোনও ঝামেলা ছাড়াই 2GB এর বেশি ব্যবহার করতে চান তবে একটি 64 বিট ওএস প্রয়োজন। এটি সমস্যাটিও কাটিয়ে উঠেছে যার মধ্যে আপনার কাছে 4 গিগাবাইট দৈহিক র‌্যাম থাকতে পারে, তবে ভিডিও কার্ডের জন্য ঠিক করা ঠিকানা জায়গাগুলি সেই মেমরির একটি বিশাল আকারের ছাঁকে ব্যবহারযোগ্য করে তুলতে পারে - সাধারণত প্রায় 500 এমবি।


1

একটি বৃহত অ্যারে বরাদ্দ করার পরিবর্তে, আপনি কি একটি পুনরুক্তি ব্যবহারের চেষ্টা করতে পারেন? এগুলি বিলম্ব-সম্পাদিত হয়, অর্থগুলি পূর্ববর্তী বিবৃতিতে অনুরোধ করার সাথে সাথে মানগুলি উত্পন্ন হয়; আপনার স্মৃতিটি এভাবে চালিয়ে যাওয়া উচিত নয়:

private static IEnumerable<double> MakeRandomNumbers(int numberOfRandomNumbers) 
{
    for (int i = 0; i < numberOfRandomNumbers; i++)
    {
        yield return randomGenerator.GetAnotherRandomNumber();
    }
}


...

// Hooray, we won't run out of memory!
foreach(var number in MakeRandomNumbers(int.MaxValue))
{
    Console.WriteLine(number);
}

উপরেরগুলি আপনার ইচ্ছামত এলোমেলো সংখ্যা উত্পন্ন করবে, তবে কেবল তাদের পূর্ববর্তী বিবৃতি দিয়ে জিজ্ঞাসা করার সাথে সাথে এগুলি উত্পন্ন করবে। আপনি এইভাবে স্মৃতিশক্তি শেষ হবে না।

পর্যায়ক্রমে, আপনার যদি সেগুলি অবশ্যই এক জায়গায় থাকে তবে এগুলি মেমরির পরিবর্তে কোনও ফাইলে সংরক্ষণ করুন।


আইট্রেস্টিং পদ্ধতির তবে আমার অ্যাপ্লিকেশনটির কোনও নিষ্ক্রিয় সময়ে আমার যতটা সম্ভব এলোমেলো সংখ্যার ভাণ্ডার সংরক্ষণ করতে হবে কারণ এই অ্যাপ্লিকেশনটি একাধিক ভৌগলিক অঞ্চলে (একাধিক মন্টি কার্লো সিমুলেশন চলমান), প্রায় %০% সমর্থন করে 24 ঘন্টা ঘন্টার উপর চলে দিনের সর্বোচ্চ সিপিইউ লোডের, দিন জুড়ে বাকি সময়গুলি আমি সমস্ত ফ্রি মেমরি স্পেসে এলোমেলো সংখ্যা বাফার করতে চাই। ডিস্কে সঞ্চয় করা খুব ধীর এবং ধরণের এবং কোনও ধরণের পরাজয় হ্রাস করে যা আমি এই এলোমেলো নম্বর মেমরি ক্যাশে অন্তর্ভুক্ত করতে পারি।
m3ntat

0

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


প্রকৃতপক্ষে আমি মেশিনটির কনফিগারেশন জানি, এটি কেবল একটি সার্ভারে চলছে এবং আমি এই স্পেসগুলির জন্য এটি লিখতে পারি। এটি একটি বিশাল মন্টি কার্লো সিমুলেশনের জন্য এবং আমি এলোমেলোভাবে র্যান্ডম সংখ্যার বাফারিং দিয়ে অনুকূলিত করার চেষ্টা করছি।
m3ntat 15


0

আপনার সমাধানটি x64 এ রূপান্তর করুন। আপনি যদি এখনও কোনও সমস্যার মুখোমুখি হন তবে নীচের মত ব্যতিক্রম ছুঁড়ে ফেলা সমস্ত কিছুকে সর্বোচ্চ দৈর্ঘ্য দিন:

 var jsSerializer = new JavaScriptSerializer();
 jsSerializer.MaxJsonLength = Int32.MaxValue;

0

আপনার যদি ভিজ্যুয়াল স্টুডিও হোস্টিং প্রক্রিয়াটির প্রয়োজন না হয়:

বিকল্পটি আনছেক করুন: প্রকল্প-> বৈশিষ্ট্য-> ডিবাগ-> ভিজ্যুয়াল স্টুডিও হোস্টিং প্রক্রিয়া সক্ষম করুন

এবং তারপর নির্মাণ।

আপনি যদি এখনও সমস্যার মুখোমুখি হন:

প্রকল্প-> বৈশিষ্ট্যাবলী-> ইভেন্টগুলি তৈরি করতে যান-> পোস্ট-বিল্ড ইভেন্ট কমান্ড লাইনে যান এবং নিম্নলিখিতগুলি আটকে দিন:

call "$(DevEnvDir)..\..\vc\vcvarsall.bat" x86
"$(DevEnvDir)..\..\vc\bin\EditBin.exe" "$(TargetPath)"  /LARGEADDRESSAWARE

এখন, প্রকল্পটি তৈরি করুন।


-2

উইন্ডোজ প্রক্রিয়া সীমা 3 জিবি বাড়ান। (boot.ini বা ভিস্তা বুট ম্যানেজারের মাধ্যমে)


সত্যি? ডিফল্ট সর্বোচ্চ প্রক্রিয়া মেমরি কি? এবং কিভাবে এটি পরিবর্তন? আমি যদি আমার পিসিতে কোনও গেম বা কিছু খেলি তবে এটি সহজেই একটি একক এক্স / প্রসেস 2+ গিগাবাইট ব্যবহার করতে পারে, আমি মনে করি না এখানে সমস্যা এটি।
m3ntat

/ 3 জিবি এর জন্য ওভারকিল হয় এবং অনেক অস্থিরতা তৈরি করতে পারে কারণ অনেক চালক মনে করেন যে ব্যবহারকারীর স্থান পয়েন্টার সর্বদা নিম্ন 2 জিবিতে নির্দেশ করে।
জুলফ

4
m3ntat: না, 32-বিট উইন্ডোতে, একটি একক প্রক্রিয়া 2 জিবিতে সীমাবদ্ধ। বাকি 2 জিবি ঠিকানা স্পেসটি কার্নেল দ্বারা ব্যবহৃত হয়।
জুলফ

এমনকি পিএই দিয়েও? microsoft.com/whdc/system/platform/server/PAE/PAEdrv.mspx
m3ntat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.