Cum să lucrați cu volume mari de șiruri de caractere

Cum să lucrați cu un volum mare de șiruri de caractere.

Programul meu funcționează cu volume mari de șiruri de caractere.
Folosesc TStringList, dar totul este atât de lent
și în ea mai mult de 64KB nu veți scrie. Cum să manipulezi rapid liniile. De exemplu, WinAmpU este practic nu greu de sortare sau pur și simplu încărcați o listă de redare de 2.000 de fișiere și căutați-le.

De ce nu puteți încărca mai mult 64KB.


> în ea mai mult de 64KB nu veți scrie.

nu este adevărat

Unde este scris despre limitarea în 64K din TStringList?

De exemplu, WinAmpU este practic nu greu de sortare sau pur și simplu încărcați o listă de redare de 2.000 de fișiere și căutați-le.

Unde se spune că face asta? (se încarcă 2 mii de nume)


> în ea mai mult de 64KB nu veți scrie

că, direct și vorbește presupus, otvali, nu voi scrie mai mult 64KB.

Reindeer Moss Eater:
sortează întreaga listă, dar ONCE după ce a fost creată - altfel

ps totul a plecat _ a plăcut a avut o discuție.

În TStringList este posibil să sufli câteva sute de Mb fără probleme și frâne, deci teoretic câteva ture ;-)

în mod evident, urmele miracolelor conduc la un stîngerist în TMemo
atunci totul este complet de înțeles

Când fac buclă prin toate liniile StringList într-o buclă, atunci
se dovedește neprofitabil în timp.

Și despre WinAmpA dacă cineva trebuie să arunce o captură de ecran
aici am MP3-uri exact 1849 după ce am tăiat 500 de piese.

Și în WinAmpE, toate aceste mormane de rânduri sunt sortate, și prin etichete în câteva secunde. Aștept doar 5 minute în programul prog pentru a citi eticheta fiecărui fișier. Da, cel puțin pentru a încărca doar numele de fișiere din StringList merge mult timp.

2 milioane de linii în TStingList sunt sortate mult mai puțin de 1 secundă - crede-mă.
În programul tău aștepți 5 secunde nu din cauza tstringlist, ci din cauza algoritmului tău inexact.

înainte de a completa lista.

- dezactivați sortarea automată
- setați capacitatea la numărul maxim de rânduri pe care doriți să le adăugați (dacă cunoașteți această valoare în prealabil)

după completarea listei înainte de a apela metodele de căutare șir după valoarea lor, activați sortarea automată

Nu știu, nu pare nimic mai bun decât Tstringlist de a lucra cu un număr mare de linii nu există. Și este puțin probabil să scurtezi timpul de căutare scriind propriul algoritm.
În măsura în care înțeleg prin (această piesă din clase)

funcția TStringList.IndexOf (const S: șir): Integer;
începe
ifnot Sorted then Result: = indicele moștenit (S) altceva
ifnot Find (S, Rezultat) apoi Result: = -1;
se încheie;

dacă lista este nesortată, atunci căutarea este efectuată printr-o căutare simplă și dacă este sortată - atunci căutarea binară. Și nimic mai eficient decât ultimul pentru liste sortate acolo.

Sortare de la mine este dezactivată.
Vorbesc despre sortarea nu este încorporată.
Sunt de acord că sistemul integrat funcționează perfect rapid.
Am sortarea listelor în funcție de algoritmii mei în prog, așa cum am nevoie pentru a sorta, de exemplu. în general, nu în modul standard.

Declar că algoritmii de sortare sunt putred, poate cineva să sfătuiască despre sortarea rândurilor?

Da, de exemplu, în ciclurile mele există un apel la VCLK, am scăpat de el și am câștigat câteva secunde, dar totuși el a lucrat cu ei de mult timp.

De exemplu, pur și simplu derulați prin toate rândurile din listă și verificați fiecare intrare pentru subcadr. Dacă aveți 1000 de linii, atunci trebuie să așteptați.

> DDS (04/02/04 23:30) [17]

De exemplu, pur și simplu derulați prin toate rândurile din listă și verificați fiecare intrare pentru subcadr. Dacă aveți 1000 de linii, atunci trebuie să așteptați.


procedura TForm1.Button1Click (expeditor: TObject);
var
i: întreg;
T: DWORD;
începe
cu TStringList.Create do
încerca
pentru i: = 0 la 999999 nu Adăugați ("asdladnadmasdmna");
T: = GetTickCount;
pentru i: = 0 la Count - 1 do Pos ("AasasaS", Strings [i]);
Titlu: = IntToStr (GetTickCount - T)
în cele din urmă
gratuit
capăt
se încheie;

rezultate:
1. StringList fără probleme a plasat un milion de linii.
2. Call Poz pentru fiecare din milioane de linii - mai puțin de o jumătate de secundă.

Concluzii Vă întreb: "Nu a fost o rolă."

Și din cauza referinței frecvente la componentele vizuale într-un ciclu, poate dura mult timp?

> DDS (05.02.04 00:07) [19]

Dacă acestea sunt reparate (de exemplu, acestea actualizează datele afișate), atunci repetarea va lua nu doar o mulțime, dar foarte mult timp.

Dacă există ciclism invarianți, scoateți-i. Dacă există apeluri către proprietățile obiectului - cache-ul acestora (de exemplu, cea mai simplă înlocuire a proprietății Text cu un șir regulat a scurtat cumva durata de funcționare a unui program de la 4 ore la 6 minute).

Și așa mai departe. Vedeți, cu construirea normală a codului acelor probleme despre care vorbiți, pur și simplu nu poate fi. Ei bine, în orice fel.

Pe scurt, am înțeles, se pare, în ceea ce este probemma.
Există o astfel de funcție:

funcția TForm1.GetKey (str: string): integer;
var i: întreg;
începe
rezultat: = - 1;
pentru i: = 0 la List.Count-1 nu
începe
dacă pos (str, List [i])> 0
apoi începeți rezultatul: = i; pauză; se încheie;
se încheie;
se încheie;

Este foarte des folosit în program
și aproape întotdeauna despre aceasta:

pentru i: = 0 la List.Count-1 nu
începe
r: = GetKey (lista [i]);
dacă r> 0 atunci List_1.Add (List [i]); // de exemplu
se încheie;

Și nici o modalitate de remake.
Pe scurt, un ciclu dublu pentru toate elementele din listă,
și întrucât listele nu sunt mici,

Oamenii, dar nu este mai ușor să transmită (TStream) totul?

hmm. Ei bine, în primul rând vă sfătuiesc să folosiți un alt algoritm Pos, nu cel din System, biblioteca se numește FastStrings. În al doilea rând, nu căutați în TStringList, ci îmbinați într-o linie cu intervale indexate pentru fiecare linie, astfel încât Pos poate fi apelată o singură dată pentru a determina numărul de linie în care a fost găsit Str.

> DDS (05.02.04 01:15) [21]
Înțelegi ce ai scris? 8-0

> pentru i: = 0 la List.Count-1 nu
> începe
> r: = GetKey (lista [i]);
> dacă r> 0 atunci List_1.Add (List [i]); // de exemplu
> sfârșit;

> Și este imposibil să remake ceva.

r este întotdeauna> 0, deoarece Lista [k] este cel puțin egală cu lista [k] pentru orice k
Prin urmare, întregul ciclu este redus la
List_1.Assign (listă);

Mulțumesc, voi încerca să scriu răspunsul.

> YuYu
r nu este întotdeauna> 0 deoarece funcția GetKey returnează -1 în cazul în care parametrul său nu este un substring al unei alte liste. Și dacă este, se întoarce indexul șirului. Și funcția funcționează, de asemenea, într-o buclă pe toată lista.

> specificând intervalele indexate pentru fiecare rând

Și mai precis, poți. Dacă scriu mesajul StringList într-o singură linie și fără probleme prin POS, ce trebuie să fac, atunci cum exprim numărul de linie știind numărul găsit prin POS.

De exemplu, trebuie să fac GetKey fără a folosi o buclă. Iată ideea, poate că e nebună, dar mi-a trecut prin minte:
Luăm un StringList și îl scriem ca Text și scriem în unele
RichEdit. Apoi, folosind RichEdit1.FindText încorporat uita-te pentru text și apoi
Exprimați numărul liniei din RichEdit de la cel găsit. Acesta va fi numărul din StringList.
Nu spun ce să fac exact, de exemplu, nu puteți folosi vizuale
componenta RichEdit și RichEdit1.FindText preluate din ComCtrls.

Avem:
RichEdit1.PlainText: = Adevărat;
RichEdit1.Text: = List.Text;
RichEdit1.SelStart: = RichEdit1.FindText (Str, 1, Lungime (RichEdit1.Text), []);
RichEdit1.SelLength: = 0;

>
Cum obțin numărul liniei de memorie în care este localizat cursorul?
Pentru aceasta, trimiteți un mesaj EM_LINEFROMCHAR.
Număr de linie: = Memo1.Perform (EM_LINEFROMCHAR, -1, 0);
>

Același lucru este folosit pentru RichEdit.
Nu jurați cu adevărat.

> DDS (05.02.04 14:46) [27]
și chiar mai bine pentru a instala MS SQL Server, caută rapid


> DDS (05.02.04 14:46) [27]

"intervalele indexate" pot fi brutale, desigur exprimate, dar de fapt totul este simplu.

s [1]: = "abc";
s [2]: = "def";
s [3]: = "ghi";

construi o serie de indicii
indexArray: matrice [1..3] de integer;
îl umplem în felul următor
indexArray [1]: = 1;
pentru i: = 2 până la 3 face indexArray [i]: = indexArray [i-1] + Lungime * s [i-1] +1;
ajungând la ultimul index
SetLength (strCommon, indexArray [3] + Lungime (s [3]));
umple strCommon
pentru i: = 1 la 3 nu
începe
Mutați (s [i] [1], strCommon [indexArray [i]], Lungime (s [i]));
strCommon [indexArray [i] -1]: = # 13;
se încheie;
Apoi vom obține poziția substringului
nPos: = Pos (strSubStr, strCommon);
și căutarea binară de către indexArray (nu voi scrie aici, vă scriu) vă va da un număr în gama originală de șiruri de caractere.
trucuri rapide caută pe internet

Am venit cu ceva: (găsit FastString)
Încărc lista în STRING cautând un substring și apoi caut prin caracterele din poziția găsită
1) spre stânga până găsesc linia de început 0Ah
2) spre dreapta până când găsesc întrerupătorul de linie 0Dh
Între ele este linia mea. De fapt, am exprimat o linie din listă. Îmi dau indicele prin IndexOf.

40000ms
Dar ritmul bătut de bătăi de modă funcționează de 5 ori mai rapid.
De ce este noua versiune mai lentă, deoarece operațiile sunt simple și nu există ciclu.

>>>
procedura TForm1.GetKey (ind: integer);
var i: întreg;
s: șir;
începe
s: = Drugoi_List [ind]; // Substring
k: = - 1;
pentru i: = 0 la List.Count-1 do / / Doar sortați prin
începe
dacă pos (s, listă [i])> 0 // găsit
apoi începe k: = i; pauză; se încheie;
se încheie;
se încheie;

>>>
procedura TForm1.GetKey (ind: integer);
var i, st_ln, ps: întreg;
st, bx: șir;
începe
tx: = List.Text; // Încărcați întreaga foaie în STRING
tx_ln: = lungime (tx); // Ei bine și lungimea într-una
st: = Drugoi_List [ind]; // Substring
st_ln: = lungimea (st); // Și lungimea ei

Sa incercat in acelasi fel nu de fiecare data incarcarea foii de stiri in STRING, dar numai prima.

TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE, TOATE!
MULTUMESC PENTRU TINE BUNE BUNE!
Am decis să salvez pentru toate astea și să las versiunea anterioară.
LUCRAREA ȘI NICE. MULTUMESC MULTUMESC!

Poziția foarte corectă, în următorul rah atunci când, de exemplu, în program va sări în mod constant AV, de asemenea, ciocan pe toate

Căutarea foarte rapidă, în orice caz, căutarea în multe fișiere megabyte se potrivește într-o secundă.

Articole similare