نمایش نتایج 1 تا 10 از 10

نام تاپیک: خطای out of memory while expanding memory stream

  1. #1

    خطای out of memory while expanding memory stream

    سلام به دوستان،
    من یه فایل 900 مگابایتی رو از روی Serverیی با کمک Stream میخوام بخونم و روی کلاینتی نمایش بدم. مشکل اینجاست که وقتی یه نمونه برنامه می‌نویسم، بدون هیچ مشکلی اجرا میشه ولی وقتی همون کد را به برنامه‌ی اصلی میبرم پیغام خطای out of memory while expanding memory stream رو میگیرم.
    اگه کسی با این پیغام خطا سر و کار داشته یا اینکه راه حلی به نظرش میرسه، ممنون میشم در اختیار من قرار بده.

  2. #2
    سلام

    قاعدتا دارید از memory stream استفاده میکنید. این object برای این حجم شاید مناسب نباشد. بالاخره حافظه ماشین حدی داره...
    دلیل اینکه در برنامه اصلی خطا میگیرید اینه که در زمان اجرای برنامه اصلی احتمالا حافظه بیشتری مصرف شده و حافظه کمتری برای stream باقی مونده.
    راهی نداره که اطلاعات رو توی یک tmp file بریزید (مثلا با file streamای چیزی)؟

    ارادت

  3. #3
    من از TFileStream استفاده میکنم،
    منظورتون از tmp file چیه؟

  4. #4
    این object برای این حجم شاید مناسب نباشد. بالاخره حافظه ماشین حدی داره...
    دلیل اینکه در برنامه اصلی خطا میگیرید اینه که در زمان اجرای برنامه اصلی احتمالا حافظه بیشتری مصرف شده و حافظه کمتری برای stream باقی مونده.
    روی User Mode "حداقل" دو گیگ برای Allocation در عادی ترین حالت داره ، و بعیده برنامهء اصلی اش 1.1 گیگ باشه !

    پیغام خطای out of memory while expanding memory stream رو میگیرم
    این خطا رو چه زمانی میگیری ؟ از استک استفاده میکنی یا هیپ ؟ و از کدام نسخهء دلفی استفاده میکنی ( FastMM ) ؟ این چند صد مگابایت اطلاعات مربوط به چه چیزی هست ؟ چطور در حال پردازش و نمایشش هستی ؟

    و بهتر هست بعد از خوندن هر چانک اطلاعات یک دیباگ لاگ اسرت کنی و با دیباگر برنامه رو اجرا کنی که مشخص بشه وقتی این خطا صادر میشه کجای حافظه هستی .
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  5. #5
    سلام


    نقل قول نوشته شده توسط Inprise مشاهده تاپیک
    روی User Mode "حداقل" دو گیگ برای Allocation در عادی ترین حالت داره ، و بعیده برنامهء اصلی اش 1.1 گیگ باشه !
    حالا حتما که ماشین 2 گیگ حافظه اصلی و virtual خالی نداره که به یک برنامه بده؛ عادی ترین حالت برای ما اینه که ماشینمون 512 مگابایتی باشه، user هم Page file درست و حسابی نذاشته باشه کلی هم task روی ماشین در حال اجرا باشه. همانطور که قبلا هم گفتم، بالاخره حدی داره. ولی اول ببینیم منشا خطا چیه (حالا که خودشون از memory stream استفاده نمیکنند)...

    برای خواندن داده های blob field مثلا با SaveToStream، حتما در خود DataSet یک BlobStream تشکیل میشه که قاعدتا باید منشاء خطا باشه...

    خطایی که شما گرفتید از متد Realloc از TMemoryStream گرفته میشه. اونجا هم از GlobalAllocPtr و GlobalReallocPtr استفاده شده که قاعدتا نوع حافظه رو از همون متغیر HeapAllocFlags مشخص میکنه که اگه بهش دست نزده باشید GMEM_MOVABLE میشه که حالت عادیه. حالا ممکنه در بقیه بخشهای برنامه یک کدی داشته باشید که این تنظیم رو عوض کنه که اونوقت به قول Inprise باید ببینیم استک استفاده شده یا نه....

    فرض میکنم از ADODB استفاده میکنید؛ اونجا یک ADOBlobStream استفاده میشه که دقیقا از MemoryStream مشتق شده ولی نکته اینجاست که Realloc رو بازنویسی کرده. یعنی اگر هم حافظه کم بیاره باید از این خطاهای سیستمی بده، نه یک خطای دلفی.

    به هر حال تقریبا معلومه که مشکل چیه، ولی راه حل آنی به نظرم نمیرسه؛ شاید بشه به صورت سطح پایین‌تر (مثلا با بررسی کد ADOBlobStream) بدون تشکیل Stream واسط هم داده‌ها رو خوند ولی شک دارم....

    ارادت
    پ ن : من یکبار تقریبا همین داستانها رو نوشته بودم ولی مثل اینکه پاک شده یا browser من قاطی کرده؛ به هر حال اگه پست تکراری شد قبلا پوزش میخوام...

  6. #6
    این خطا رو چه زمانی میگیری ؟ از استک استفاده میکنی یا هیپ ؟ و از کدام نسخهء دلفی استفاده میکنی ( FastMM ) ؟ این چند صد مگابایت اطلاعات مربوط به چه چیزی هست ؟ چطور در حال پردازش و نمایشش هستی ؟
    خطا رو به محض اجرای FileStream.LoadFromFile میگیرم(در ادامه بیشتر توضیح میدم)، از هیپ و دلفی 5 استفاده میکنم و اطلاعات مربوط به یک عکس از یک سری نقشه هست و دارم سعی میکنم که با ImageEn نمایشش بدم.

    خطا رو به محض اجرای FileStream.LoadFromFile میگیرم، یعنی حتی 1 ثانیه زمان صرف خواندن اطلاعات نمیشه و به سرعت پیغام خطا میده، کد به شکل زیر هست تقریباً:


    var
    Strm: TّFileStream;
    begin
    Strm := TMemoryStream.Create('\\AServer\File_0001.Jpg', fmOpenRead or fmShareDenyWrite);

    end;
    این اطلاعات دقیقاً روی یک مسیر روی Server هست و توی جدول توی دیتابیس قرار نداره.
    آخرین ویرایش به وسیله Inprise : چهارشنبه 05 دی 1386 در 23:18 عصر دلیل: .

  7. #7
    به نظرتون اصلاً صحیح هست که این حجم از اطلاعات (که میتونه بیشتر هم باشه و هم میتونه تعداد کاربرانی که این فایل‌های حجیم رو لود میکنند زیاد باشه ) یکجا خوانده بشه؟

  8. #8
    میتونی خروجی دیباگر در لحظه وقوع خطا رو بگذاری اینجا ؟
    ( یه سری ایده هست اما این اول از همه لازمه )
    UNIX is simple. It just takes a genius to understand its simplicity
    -- Dennis Ritchie

  9. #9
    سلام

    1. قاعدتا من هنوز با ترم‌هایی که بقیه دوستان بکار میبرند آشنا نیستم به همین دلیل پرت میافتم.

    2. تازه فهمیدم که اصلا Data Baseای درکار نیست و منظور از سرور اونی نبوده که من فهمیدم.

    3. تا حالا اینقدر احساس شفاف بودن نکرده بودم.

    4. هنوز هم فکر میکنم مشکل در استفاده از MemoryStream برای این حجم از داده‌ها است. انتقال این حجم داده اصلا غیرممکن نیست ولی FileStream و استفاده از tmp file (همون فایل موقت یا temporary) توصیه میشه. شما میگید از FileStream استفاده میکنید، اما هم constructor در کد نمونه مربوط به MemoryStream هستش و هم اینکه FileStream اصولا متدی به نام LoadFromFile نداره.

    5. دلیل اینکه بلافاصله خطا میگیره، اینه که در همون ابتدای خواندن از فایل در MemoryStream میخواد Capcity رو تعیین کنه که با خطای کمبود حافظه مواجه میشه. داستان میتونه به همین سادگی باشه....

    ارادت

  10. #10
    4. هنوز هم فکر میکنم مشکل در استفاده از MemoryStream برای این حجم از داده‌ها است. انتقال این حجم داده اصلا غیرممکن نیست ولی FileStream و استفاده از tmp file (همون فایل موقت یا temporary) توصیه میشه. شما میگید از FileStream استفاده میکنید، اما هم constructor در کد نمونه مربوط به MemoryStream هستش و هم اینکه FileStream اصولا متدی به نام LoadFromFile نداره.
    درسته، اون خط رو با عجله نوشتم و اون اشتباه پیش اومد.

تاپیک های مشابه

  1. Send Memory Stream As File to Application
    نوشته شده توسط combat1964 در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 8
    آخرین پست: شنبه 18 شهریور 1385, 22:08 عصر
  2. دلیل خطای Out of memory
    نوشته شده توسط Hossein Moradi در بخش برنامه نویسی در 6 VB
    پاسخ: 5
    آخرین پست: یک شنبه 14 اسفند 1384, 22:50 عصر
  3. out of memory که میدونم بحث شده
    نوشته شده توسط H_SH_VB در بخش برنامه نویسی در 6 VB
    پاسخ: 7
    آخرین پست: یک شنبه 14 اسفند 1384, 14:39 عصر
  4. اشکال Out of Memory
    نوشته شده توسط Reza_sh_42 در بخش برنامه نویسی در 6 VB
    پاسخ: 3
    آخرین پست: جمعه 16 دی 1384, 00:24 صبح
  5. اشکال در کامپایل برنامه 'Out off memory'????
    نوشته شده توسط user addi در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 1
    آخرین پست: یک شنبه 21 فروردین 1384, 23:49 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •