PDA

View Full Version : ارسال داده حجیم با indy



farhadyoosefi
پنج شنبه 29 فروردین 1387, 13:57 عصر
سلام بچه ها
من می خوام backup پایگاه دادم رو روی یه سیستم دیگه restore کنم تا اگه برای سرورم اتفاقی افتاد بتونم سیستم پشتیبانم رو راه بندازم
برای قسمت انتقال برنامه از Streamfileاستفاده کردم که file رو می بره داخل حافظه و از حافظه میخونه , مشکل من اینجاست که database من 10GB حجم داره و این حجم اونقدر بالاست که دیگه نمیشه از Streamfile استفاده کرد حتی اگه فایلم رو rar کنم بازم 1.5GB حافظه خالی احتیاج دارم
لطفا راهنماییم کنید که چطور می شه با indy فایل های حجیم رو انتقال داد
ممنون

مهران موسوی
پنج شنبه 29 فروردین 1387, 15:44 عصر
با سلام ... دوست عزیز فکر انتقال این فایل رو به حافظه نکن ... چون هیچ رمی 10 گیگابایت نیست .... !!!!

برای انتقال توسط indy هم بهتره اول فشرده کنی فایلت رو بعد توسط یک thread عملیات انتقال رو انجام بدید .... اینجوری حداقلش این هست که برنامه ی اصلی با مشکل مواجح نمیشه ... ( البته شاید راه های دیگه ای هم باشه ... !!!‌ )

vcldeveloper
پنج شنبه 29 فروردین 1387, 16:40 عصر
StreamFile که نمیاد 10 گیگ فایل رو یکجا وارد حافظه بکنه! فایل به بخش های کوچکی (Chunk) تقسیم میشه که کار شما مربوط به هر بخشی باشه، همون بخش در حافظه لود میشه. پس مشکلی از این جهت نیست، فقط مشکل سرعت شبکه است، چون حتی در شبکه های سریع هم این حجم داده برای انتقال نیاز به زمان نسبتا زیادی داره.
برای Indy هم کار به همون شکل سابق هست، یعنی می تونید بهش یه Stream بدید تا Indy اونو براتون ارسال کنه. فکر کنم مثالش هم توی همین سایت موجود باشه.

farhadyoosefi
پنج شنبه 29 فروردین 1387, 17:51 عصر
دوستان وقتی با فایلی با حجم حدود 1GB کار می کنم برنامه بدون مشکل اجرا میشه ولی همین که فایلم بزرگ میشه(بیشتر از فضای خالی ram) بهم خطا میده
راستی backap رو rar کردم که حدود 1.5GB شد که بازم اینقدر حافظه خالی ندارم
فکر کنم چاره کار اینکه فایلم رو ftp کنم .چون فکر کنم ftp دیگه با ram کاری نداره
اگه از بچه ها کسی با ftp تو indy کار کرده لطفا راهنمایم کنه
ممنون

مهران موسوی
جمعه 30 فروردین 1387, 01:27 صبح
دوست عزیز یک روشی دیگه اینه که خودت دستی بیای و فایلت رو به چند قسمت تقسیم کنی و هر قسمت رو در یک نوبت ارسال کنی بعد وقتی همه ی قسمتها ارسال شدن بیای و همه ی قسمتها رو با هم دوباره جمع کنی و در مسیر مورد نظر ذخیره کنی ....

مثلا من براتون یکProcedure نوشتم که هر عددی بهش بدی به دو قسمت صحیح تقسیمش میکنه ...




procedure Sp_2(anum:Integer ; var b,d:Integer);
var
a:Integer;
c,b1:Real;
begin
a := anum;
b1:= anum / 2 ;
c:=frac(b1);
d:=trunc(b1+c);
b:=trunc(b1);
end;

طریقه ی فراخوانی

procedure TForm1.Button1Click(Sender: TObject);
var
b,d:Integer;
begin
Sp_2(10000541 ,b,d);
ShowMessage(intToStr(b));
ShowMessage(intToStr(d));
end;

بعد با توجه به حاصل این Procedure میتونید Stream مورد نظر رو تقسم کنی ... و بعد هم که ارسال ... البته این Procedure رو میتونید جوری طراحی کنید که به قسمتهای بیشتری تقسیم کنه و ....



یا حق ...