13-11-2018, Saat: 09:27
Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim.
|
Dosya Bulma (Algoritmik Soru Serisi)
|
|
13-11-2018, Saat: 09:27
Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim.
13-11-2018, Saat: 09:51
(13-11-2018, Saat: 09:27)esistem Adlı Kullanıcıdan Alıntı: Ş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.
13-11-2018, Saat: 09:57
İ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.
(13-11-2018, Saat: 09:57)engerex Adlı Kullanıcıdan Alıntı: İ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.
13-11-2018, Saat: 11:24
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.
13-11-2018, Saat: 11:27
(Son Düzenleme: 13-11-2018, Saat: 11:30, Düzenleyen: ssahinoglu.)
(13-11-2018, Saat: 09:51)yhackup Adlı Kullanıcıdan Alıntı:(13-11-2018, Saat: 09:27)esistem Adlı Kullanıcıdan Alıntı: Şimdi kodu inceledim de sanırım @ssahinoglu nun yöntemi ile buluyor ama siz yinede bi deneyin derim. 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. (13-11-2018, Saat: 11:24)esistem Adlı Kullanıcıdan Alıntı: 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ı:(13-11-2018, Saat: 09:51)yhackup Adlı Kullanıcıdan Alıntı: ilk denediğimde 83 saniyede ikinci de 3 saniyede üçüncüde 4 saniyede buldu. Bu postta örnek olarak aslında tam olarak istenilen giriş verisi ve çıkış verisi var. http://www.delphican.com/dosya-bulma-alg...6#pid22486
14-11-2018, Saat: 08:52
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.
14-11-2018, Saat: 10:07
(13-11-2018, Saat: 10:05)yhackup Adlı Kullanıcıdan Alıntı:(13-11-2018, Saat: 09:57)engerex Adlı Kullanıcıdan Alıntı: İ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. Ben olayı tam anlamadım 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. |
|
« Önceki Konu | Sonraki Konu »
|
| Konu ile Alakalı Benzer Konular | |||||
| Konular | Yazar | Yorumlar | Okunma | Son Yorum | |
| Soru : Interface mi, Abstract Class mı? | uparlayan | 3 | 4.994 |
24-08-2023, Saat: 20:15 Son Yorum: veteran |
|
| Windows Mesajlaşma Sistemi Hk. Soru (+10 Puan) | Tuğrul HELVACI | 26 | 23.609 |
06-10-2022, Saat: 18:47 Son Yorum: Master_Crazy |
|