delphi4arab منتديات دلفي للعرب
السرعة في البحت - نسخة قابلة للطباعة

+- delphi4arab منتديات دلفي للعرب (https://delphi4arab.net/forum)
+-- قسم : منتديات دلفي للعرب التعليمية (https://delphi4arab.net/forum/forumdisplay.php?fid=3)
+--- قسم : سؤال و جواب حول دلفي (https://delphi4arab.net/forum/forumdisplay.php?fid=15)
+--- الموضوع : السرعة في البحت (/showthread.php?tid=1805)



السرعة في البحت - abdelmalek - 19-03-2010

السلام عليكم ورحمة الله وبركاته

كيف يمكنني الوصول الى البيانات بسرعة ؟
مثلا :
لديا ملف من نوع record يحتوي على ارقام بطاقات + اسمائها
كيف يمكنني الوصول الى البطاقة رقم 10 واظهار إسمها بدون استعمال هده الطريقة :
C_NX = 10
PHP كود :
function Open_Card_N(C_NX : integer):Tcard; // function Open card
  
var
    
F : file of TCard;
    
TempCard : TCard;
  
begin
    format_card
(TempCard);
    
Assignfile(F, File_Name);
    
REset(F);
    while 
Not EoF(f) do
      
begin
        read
(f,TempCard);
        if 
C_NX = TempCard.Card_Number then
          begin
            result
:=TempCard;
            
Closefile(f);
            Exit;
          
end;
      
end; 
يعني بدون اجراء loop فهيا تضيع الوقت
افيدونا بايي طريقة اخرى تكون اسرع افادكم الله
بارك الله فيكم


السرعة في البحت - shagrouni - 19-03-2010

لا مفر من الـ Loop.
يمكن تسريع العمل بأن يتم قراءة الملف مرة واحدة ووضعه في حيز Buffer، ثم البحث داخل هذا الحيز في الذاكرة.
مع ملاحظة أن ويندوز تقوم بنسخ أي ملف تتم قراءته من القرص في cash memory ذاكرة وقتية، وبالتالي فالقراءة الثانية تكون من هذه الذاكرة.
حل آخر أن يكون هناك ملف فهرس لملف البيانات فيه بيانات موقع التسجيلة المطلوبة داخل ملف البيانات.

فيما يلي توليف، يقوم بقراءة الملف باستخدام TMemoryStream


PHP كود :
function GetCardByNumberEx(ANumber: integer): TCard;
var
  
TempCard: TCard;
  
MStream: TMemoryStream;
  
iFileSize: cardinal;
  
iRecordSize: integer;
  
iRcordCont: integer;
  
i: integer;
begin

  FillChar
(result, Sizeof(result), #0);

  
if FileExists(FILE_NAME) then
  begin
    iRecordSize 
:= Sizeof(TCard);

    
MStream := TMemoryStream.Create;
    try
      
MStream.LoadFromFile(FILE_NAME);

      
iFileSize := MStream.Size;
      
iRcordCont := iFileSize div iRecordSize;

      
MStream.Seek(0, 0);
      for 
i := 1 to iRcordCont do
      
begin
        MStream
.Read(TempCard, iRecordSize);

        if 
TempCard.Number_card = ANumber then
        begin
          result 
:= TempCard;
          break;
        
end;

      
end;

    finally
      
MStream.Free;
    
end;
  
end

end
; 



السرعة في البحت - abdelmalek - 19-03-2010

بارك الله فيك على هده المعلومات القيمة
اخي الكريم ممكن تشرح هدا الكود
PHP كود :
MStream.Seek(0, 0); 

إقتباس :حل آخر أن يكون هناك ملف فهرس لملف البيانات فيه بيانات موقع التسجيلة المطلوبة داخل ملف البيانات.
ممكن تعطيني متال عن كيفية استخدام هدا الحل بارك الله فيك