Wyszukiwanie... mega wyszukiwanie...

Odpowiedz Nowy wątek
2004-09-20 20:38
tomek
0

mam 40mb plik ktory jest zbiorem wyrazow - potrzebne mi jest to jako slownik... i terach chodzi o wyszukiwanie (a w zasadzie sprawdzanie czy konkretny wyraz tam istnieje)... naturalnie wiem jak sprawdzic czy wyraz istnieje w danym ciagu ale jak sprawic zeby w tym 40mb pliku zrobic to tak aby nie obciazyc za bardzo pamieci i procesora - bo samo zaladowanie do zmiennej moze spowodowac zawieszke kompa (jak laduje to do WordPada to mi komp prawie wisi - a WordPad zajmuje ponad 70mb pamieci). chodzi o to zeby najlepiej nie wzytywac pliku do pamieci tylko operowac na zasadniczym pliku... ale jak to zrobic? szubko, sprawnie, bez obciazen... PROSZE!

Pozostało 580 znaków

2004-09-20 20:45
0

readln i help ... np http://www.delphibasics.co.uk/RTL.asp?Name=ReadLn


Pozostało 580 znaków

2004-09-20 20:46
nav
0

filestream / textfile + f1


utf-8 rlz! ٩(ಥ_ಥ)۶

Pozostało 580 znaków

2004-09-20 20:47
0

Zastanow sie czy nie uzyc drzew w celu zmniejszenia zajetosci pamieci i zwiekszenia szybkosci wyszukiwania.

Pozostało 580 znaków

2004-09-20 21:06
tomek
0

uzylem readln ale to trwa w niekonczonosc... tam jest 2.5 mln linii wiec troche to w zasadzie trwa... jak to zrobic jeszcze inaczej? moze jakis przykladowy kod?

Pozostało 580 znaków

2004-09-20 21:15
0

Nie wiem, czy to pomoże, ale...
Jeśli masz plik z wyrazami, to może go posortuj(o ile nie jest jeszcze posortowany). Zapamiętaj od kórej linijki zaczynają się wyrazy na 'a' na 'b' itd. Jeśli bedziesz sprawadzał czy dany wyraz istnieje w pliku to zaczniesz wyszukiwanie od odpowiedniej linijki.

Pozostało 580 znaków

2004-09-20 21:43
0

Posortować? .. Ty wiesz ile to zajmie? :-/

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  TSearch = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

procedure TSearch.Execute;
var
  T: TextFile;
  s: string;
  i: Integer;
begin
  AssignFile(T, 'C:\test.txt');
  Reset(T);
  i := 0;
  repeat
    Readln(T, s);
    if pos('szukana fraza', s) > 0 then
      Form1.Memo1.Lines.Add('Linia: "' + s + '" nr : ' + IntToStr(i));
    Inc(i);
  until EOF(T);
  CloseFile(T);
  Form1.Label1.Caption := 'Koniec szukania';

end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  Search: TSearch;
begin
  label1.Caption := 'Szukanie...';
  Search := TSearch.Create(False);

end;

end.

Pozostało 580 znaków

2004-09-20 21:54
0

Ile to zajmie to nie wiem, ale przecież nie trzeba dokładnie sortować wyrazów wg alfabetu. Wydaje mi się, ze znacznie przyspieszy się wyszukiwanie gdy wyrazy będą chociaż posortowane wg pierwszych literek. Zresztą posortowac plik wystarczy raz.

Pozostało 580 znaków

2004-09-21 14:02
0

Ile to zajmie to nie wiem, ale przecież nie trzeba dokładnie sortować wyrazów wg alfabetu. Wydaje mi się, ze znacznie przyspieszy się wyszukiwanie gdy wyrazy będą chociaż posortowane wg pierwszych literek. Zresztą posortowac plik wystarczy raz.

wg mnie też należałoby posortować plik albo wg pierwszych liter (czyli przeszukujesz wtedy tylko około 1/20 pliku), albo wg kategorii wyrazów

Detox: posortować przecież można w wątku, albo kilku (wystarczy podzielić plik na części)

// przecież tak właśnie napisalem wyszukiwanie :) - detox


Piszę programy w językach: C, C++, Java, Python, Bash, PHP, SQL.
Przyjmuję zlecenia

Pozostało 580 znaków

2004-09-21 17:37
tomek
0

Wiec moze rozwiaze problem: wyrazy sa juz posortowane. Ale teraz pytanie brzmi nastepujaco: przykladowo slownik sie zmienia, wyrazy sa dodawane wiec nastepuje przesuniecie... Wtedy maly zonk... Bo sposob Detoxa jest na pewno lepszy niz moj ale mimo wszystko przeszukanie slownika trwa okolo minuty... Na takie cos nie bardzo moge sobie pozwolic :/ Pomyslalem ze mozna by zrobic inaczej... Sprawdzic najpierw srodkowa czesc slownika - jezeli wyraz jest w pierszej polowie (wystarczy sprawdzic czy wedlug alfabetu jest wczesniej czy pozniej), potem to jeszcze raz na polowe... Tak dajmu na to 10 razy - wtedy pozostaje do sprawdzenia ok 30 wyrazow... Wtedy juz banal... Ale jak moge sprwdzic 'dynaczmicznie' ile jest linii? Musze leciec najpierw petla z EOF (co trwa i trwa...) czy mozna to jakos szybciej odczytac ilosc linii?

Pozostało 580 znaków

2004-09-21 18:14
0

Poszukaj artykułów o uniwersalnej strukturze słownikowej, tam będzie odpowiedź na twoje pytania.


Słowa kierownika : To, jak wy zdążycie to napisać, to ja mam w szeroko rozumianej du*ie.
http://project1.pl

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0