Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Dosya Bulma (Algoritmik Soru Serisi)
#21
Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#22
(13-11-2018, Saat: 09:27)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim.

ilk denediğimde 83 saniyede ikinci de 3 saniyede üçüncüde 4 saniyede buldu.

benim fonksiyon 0 saniyede buluyor. aynı süreyi yakalayabilen olursa salise bazında ölçeceğim.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#23
İlk denemede dosya verileri diskten okunuyor. Sonraki denemelerde dosya bilgileri arabellekte olduğundan diskten okuma yapmıyor. Bu yüzden ilk okumayı gözardı edin derim.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#24
(13-11-2018, Saat: 09:57)engerex Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.İlk denemede dosya verileri diskten okunuyor. Sonraki denemelerde dosya bilgileri arabellekte olduğundan diskten okuma yapmıyor. Bu yüzden ilk okumayı gözardı edin derim.

@ssahinoglu Emeğiniz için teşekkürler ancak benim işimi görmez, çünkü bu arama bir defa yapılacak ikinci defa yapılmayacak. ilk aramada çok hızlı bir şekilde bulmam lazım.

Siz diskte arama yapıyorsunuz anladığım kadarıyla.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#25
aranan dosya, girilen tarihten max. 15 Gün önce veya sonra olacağı için klasör isminden tarihi bulup, 15 gün önce ve sonrasındaki klasör isimleri liste halinde düzenlenip, sadece 30 klasörde içten dışa arama yapılarak çok daha hızlı sonuç elde edilebilir.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#26
(13-11-2018, Saat: 09:51)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(13-11-2018, Saat: 09:27)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim.

ilk denediğimde 83 saniyede ikinci de 3 saniyede üçüncüde 4 saniyede buldu.

benim fonksiyon 0 saniyede buluyor. aynı süreyi yakalayabilen olursa salise bazında ölçeceğim.


Soruyu tam anladığımı sanmıyorum.
Dizinler sıralı gittiğine göre yarılama yöntemiyle hızlıca bulabilirsin. Ardışık olmak zorunda değil.
İlk ve son tarihten başlanıp her seferinde ortadaki tarih araştırılır. Toplam 1000 dizin için 10 aşamada dosya bulunur.
Cevapla
#27
(13-11-2018, Saat: 11:24)esistem Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.aranan dosya, girilen tarihten max. 15 Gün önce veya sonra olacağı için klasör isminden tarihi bulup, 15 gün önce ve sonrasındaki klasör isimleri liste halinde düzenlenip, sadece 30 klasörde içten dışa arama yapılarak çok daha hızlı sonuç elde edilebilir.

Evet bu güzel bir yöntem muhtemelen hızlı bir sonuç verecektir. Benzer bir mantık kullanıyorum.

(13-11-2018, Saat: 11:27)ssahinoglu Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(13-11-2018, Saat: 09:51)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.ilk denediğimde 83 saniyede ikinci de 3 saniyede üçüncüde 4 saniyede buldu.

benim fonksiyon 0 saniyede buluyor. aynı süreyi yakalayabilen olursa salise bazında ölçeceğim.


Soruyu tam anladığımı sanmıyorum.
Dizinler sıralı gittiğine göre yarılama yöntemiyle hızlıca bulabilirsin. Ardışık olmak zorunda değil.
İlk ve son tarihten başlanıp her seferinde ortadaki tarih araştırılır. Toplam 1000 dizin için 10 aşamada dosya bulunur.

Bu postta örnek olarak aslında tam olarak istenilen giriş verisi ve çıkış verisi var.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#28
Cevapların bir çoğu verilen dizin içerisinde genel bir arama, Benim kullandığım yöntem içten dışa arama önce kendi dizini sonra bir üst path'e çıkarak oradaki klasörler bulamaz ise bir üst path'e çıkarak arama.

Bu şekilde istediğim dosyayı 2 üst path'te bulması 00:00:00:009 ms sürüyor,  System.IOUtils teki TDirectory sınıfı bu için biçilmiş kaftan.
açıklayıcı yazmaya çalıştım cevap veren herkese teşekkürler.

unit Ufindfiles;

interface

uses
 Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
 System.Classes, Vcl.Graphics, System.Diagnostics,
 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses
 System.Types, System.IOUtils;

{$R *.dfm}

function Findfiles(FName: String): String;
 function Findfile(FFolder, FName: String): String;
 var
   i: integer;
   Files: TStringDynArray;
 begin
   (*
     GetFiles klasör içerisindeki dosyaların adlarını,
     path ile birlikte dönüyor
     'D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml'
   *)
   Files := TDirectory.GetFiles(FFolder);
   for I := Low(Files) to High(Files) do
     if ExtractFileName(Files[i]) = FName then
       exit(Files[i])
 end; // function Findfile

var
 i, a: integer;
 Directories, Directories2: TStringDynArray;
 FolderParent, MFolder, MFName: String;
begin
 (*
   D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml
   To
   D:\Gunes\Kasım\07
 *)
 MFolder := ExtractFileDir(FName);

 (*
   D:\Gunes\Kasım\07\OPS_GUNES_KASKO_REQUEST_EPID1453.xml
   To
   OPS_GUNES_KASKO_REQUEST_EPID1453.xml
 *)
 MFName := ExtractFileName(FName);

 (*
   D:\Gunes\Kasım\07 dizininde arıyor.
 *)
 result := Findfile(MFolder, MFName);
 if result <> '' then
   exit;

 (*
   Bir Üst Path'deki klasörler taranıyor
   GetParent D:\Gunes\Kasım\ dizinini dönüyor,
   dizinindeki klasör listesini alıp tek tek klasörlerin içini tarıyor.
   GetDirectories  'D:\Gunes\Kasım\01','D:\Gunes\Kasım\02'...
 *)
 FolderParent := TDirectory.GetParent(MFolder);
 Directories := TDirectory.GetDirectories(FolderParent);
 for I := Low(Directories) to High(Directories) do
 begin
   result := Findfile(Directories[i], MFName);
   if result <> '' then
     exit;
 end; // for i

 (*
   Bir seviye daha Üst Path klasörleri taranıyor.
   GetParent D:\Gunes\ dizinini dönüyor,
   dizinindeki klasör listesini alıp tek tek klasörlerin içini tarıyor.
   GetDirectories  'D:\Gunes\Kasım','D:\Gunes\Aralık'...
   sonra ilk klasörden başlayarak döngü halinde sırayla klasörleri arıyor.
 *)
 FolderParent := TDirectory.GetParent(FolderParent);
 Directories := TDirectory.GetDirectories(FolderParent);
 for I := Low(Directories) to High(Directories) do
 begin
   Directories2 := TDirectory.GetDirectories(Directories[i]);
   for a := Low(Directories2) to High(Directories2) do
   begin
     result := Findfile(Directories2[a], MFName);
     if result <> '' then
       exit;
   end; // for a
 end; // for i
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Sure: TStopwatch;
 Time: String;
begin
 Sure := TStopwatch.StartNew;
 Memo1.Lines.Add('Find: ' + Findfiles(Edit1.Text));
 Time := Format('%s sürede bulundu!',
   [FormatDateTime('hh:nn:ss:zzz', Sure.ElapsedMilliseconds / MSecsPerDay)]);
 Memo1.Lines.Add('Time: ' + Time);
end;

end.
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
WWW
Cevapla
#29
(13-11-2018, Saat: 10:05)yhackup Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.
(13-11-2018, Saat: 09:57)engerex Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.İlk denemede dosya verileri diskten okunuyor. Sonraki denemelerde dosya bilgileri arabellekte olduğundan diskten okuma yapmıyor. Bu yüzden ilk okumayı gözardı edin derim.

@ssahinoglu Emeğiniz için teşekkürler ancak benim işimi görmez, çünkü bu arama bir defa yapılacak ikinci defa yapılmayacak. ilk aramada çok hızlı bir şekilde bulmam lazım.

Siz diskte arama yapıyorsunuz anladığım kadarıyla.

Ben olayı tam anlamadım Big Grin Bu yüzden arama yapmıyorum.
Arkadaşlar ilk aramanın 15 saniye sonrakinin 1 saniye sürdüğünden bahsettiği için bir açıklama yazdım.
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Soru : Interface mi, Abstract Class mı? uparlayan 2 893 26-01-2019, Saat: 22:17
Son Yorum: narkotik
  Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) Tuğrul HELVACI 21 3.857 08-09-2017, Saat: 13:55
Son Yorum: ismailkocacan



Konuyu Okuyanlar: 1 Ziyaretçi