Hogyan kell kezelni a nagy mennyiségű tételek

Hogyan kell kezelni a nagy mennyiségű sorokban.

Saját program működik, nagy térfogatú vonalak.
ÉN használ TStringList, de olyan Makár minden lassan fut
és ez több, mint 64KB nem lehet rögzíteni. Milyen gyorsan manipulálni húrok. Például WinAmpU gyakorlatilag nem okoz nehézséget válogató, vagy egyszerűen csak betölteni a lejátszási listát 2000-fájlok és keresi azokat.

Miért van több, mint 64 ezer nem fog elindulni.


> Ez több, mint 64KB nem lehet rögzíteni.

valótlanság

Hol van az megírva, ami a 64k a TStringList?

Például WinAmpU gyakorlatilag nem okoz nehézséget válogató, vagy egyszerűen csak betölteni a lejátszási listát 2000-fájlok és keresi azokat.

Hol van az megírva, hogy ő csinálja? (2 hajó ezer nevek)


> Ez nem lehet rögzíteni több mint 64KB

hogy a megfelelő, és azt mondja, nos, hát ki, ne írj le több mint 64 KB.

Rénzuzmó Eater:
rendezve a teljes lista, de ha egyszer a létrehozása után -, vagy bármilyen módon

ps minden kilépő _priyatno_ volt szó.

A TStringList nyomja több száz Mb gond nélkül, és a fékeket, így elvileg párosítani gigov ;-)

látható nyomok csodák vezet stringlistu megkomponált TMemo
akkor minden érthető

Mikor végighaladni az összes vonal StringList
Kiderült drága idővel.

És a WinAmpA ha valakinek szüksége lehet dobni screenshot
Most már pontosan 1849 MP3shek után én szeletelt darab 500.

És WinAmpE egész halom sorok vannak sorolva, címkéket és néhány másodpercig. Benne vagyok a szó prog csupán 5 perc várakozás, amíg a tag olvas ki minden fájlt. Igen, legalábbis a hajó csak a fájl nevét a StringList hosszú.

2.000.000 sorok rendezett TStingList sokkal kevesebb, mint 1 másodperc - hisz.
Az ő prog akkor várjon 5 másodpercet miatt tstringlist, hanem azért, mert pontatlanságokat az algoritmus.

töltés előtt a listán.

- disconnect auto sort
- helyezze a kötődését Kapacitás egyenlő maks.chislu sorok, amelyek a tervek adni (ha ez az érték előre ismert te)

kitöltése után, mielőtt a híváslista keresési módszereket sorokban értéküket benne auto sort

Nem tudom, azt hiszem, semmi sem jobb Tstringlist dolgozni egy nagy sorok száma nem létezik. És valószínű, hogy képes csökkenteni a keresési írásakor az algoritmust.
Mert, ha jól értem azt (ez a darab osztályok)

működnek TStringList.IndexOf (const S: string): egész;
kezdődik
ifnot Rendezett majd Eredmény: = öröklött indexOf (S) mást
ifnot Find (S, Eredmény) majd Eredmény: = -1;
végén;

Ha a lista szétválogatott, a keresés egyszerű felsorolás, és ha válogatni - a bináris keresés. És sem hatékonyabb, mint az utóbbi szétválogatott sem tartalmaz.

Rendezés engem.
Én nem beszélek a beépített válogatás.
Egyetértek azzal, hogy a beépített tökéletesen működik gyors.
Azt prog sort listák algoritmusok, ahogy kell rendezni például arr. eljárás általában nem szabványos módon.

Azt dkmayu hogy romlott rendezési algoritmusok, tud valaki tanácsot ad a régi vonalak osztályozása?

Igen a cikkhez megyek ciklusokban fellebbezni VCLkam én megszabadulni, és nyert, mint egy pár másodperc, de még hosszú idő, ő dolgozik velük.

Például, csak rendezni a listát, és ellenőrizze, minden vonalat előfordulása részkarakterláncként. Ha az 1000 sor várni kell.

> DDS (04.02.04 23:30) [17]

Például, csak rendezni a listát, és ellenőrizze, minden vonalat előfordulása részkarakterláncként. Ha az 1000 sor várni kell.


eljárás TForm1.Button1Click (Sender: TObject);
var
i: integer;
T: DWORD;
kezdődik
A TStringList.Create do
megpróbál
i: = 0-999999 do Add ( "asdladnadmasdmna");
T: = GetTickCount;
i: = 0 Count - 1 do Pos ( "AasasaS", Strings [i]);
Caption: = IntToStr (GetTickCount - T)
végül
ingyenes
vég
végén;

találatok:
1. StringList probléma nélkül össze egymillió sor.
2. A hívás Pos minden millió sor - kevesebb, mint fél másodperc alatt.

A végkövetkeztetést: „Nem volt egy tekercs.”

És mivel a gyakori hivatkozás a vizuális elemek, amelyek egy cikluson moget időigényes?

> DDS (05.02.04 00:07) [19]

Ha ők így rajzolni (például frissíti a megjelenített adatok) - Az újrarajzolás lesz nem csak egy csomó, de sok időt.

Ha a ciklus invariáns - húzzuk ki őket. Ha van egy utalás a tárgyak tulajdonságait - zakeshiruyte őket (például egy egyszerű csere a Text tulajdonság, hogy egy hagyományos karakterlánc valahogy csökkenteni a működési idő egy program 4 órától 6 perc).

És így tovább. D. Tudod, a szokásos építési szabályzat a problémákat beszélünk, csak nem lehet. Nos semmilyen módon.

Röviden, rájöttem, úgy tűnik, mint probemma.
Van egy funkció:

funkció TForm1.GetKey (str: string): integer;
var i: integer;
kezdődik
eredmény: = - 1;
i: = 0 List.Count-1 do
kezdődik
ha pos (str, List [i])> 0
Ezután kezdődik eredmény: = i; break; végén;
végén;
végén;

Gyakran használják a programban
és majdnem mindig valami ilyesmi ebben a formában:

i: = 0 List.Count-1 do
kezdődik
r: = GetKey (List [i]);
ha r> 0, akkor List_1.Add (List [i]); // például
végén;

És nem lehet visszaállítani.
Röviden kétkörös egész lista elemei,
és mivel a listák nem kicsi, akkor

Az emberek, és nem könnyebb flow (TStream) mindent megtesz?

hmm. Nos először is javasoljuk, hogy használjon egy másik algoritmust Pos, nem az, hogy a rendszer, az úgynevezett moslék könyvtár FastStrings. Másodszor kért nem TStringList, és egyesíti egy sor jelzi, indexelési tartományok minden sorban, így Pos nevezhetjük csak egyszer, hogy meghatározza a sor számát, amely megtalálható a Str.

> DDS (05.02.04 01:15) [21]
Tudomásul veszi, hogy írásbeli? 8-0

> Az i: = 0 List.Count-1 do
> kezdődik
> R: = GetKey (List [i]);
> Ha az r> 0, akkor List_1.Add (List [i]); // például
> End;

> És nem lehet visszaállítani.

r mindig> 0, mivel List [k] legalább azonos List [k] minden k-
Ezért, a teljes ciklus csökken
List_1.Assign (lista);

Köszönöm, megpróbálom, írok vissza.

> Yu
r nem mindig> 0, mert GetKey függvény értéke -1, ha az argumentum nem részstringjének másik listát. És ha a visszatérő egy sor index. És a funkció is működik egy ciklusban az egész listát.

> Megadása indexelési tartományok mindegyik sorban

És a lehető legrészletesebben. Ha leírom StringList üzenet egy sorban, minden gond nélkül át POS ennyi, akkor hogyan tudok kifejezni sorszám ismeretében száma találtak a POS.

Azaz meg kell tenni használata nélkül GetKey ciklust. Íme egy ötlet, talán őrült, de eszembe jutott, hogy:
Vegye StringList és jegyezzük meg, mint a szöveg és írd meg az egyes
RichEdit. Ezután a beépített RichEdit1.FindText keresett szöveget, majd
expressz sorszám a RichEdit a naydennogoyu. Ez lesz a száma StringList.
Nem azt mondom, hogy meg kell csinálni pontosan, például nem tudja használni a vizuális
RichEdit komponenst és RichEdit1.FindText elvenni ComCtrls.

kapjuk:
RichEdit1.PlainText: = true;
RichEdit1.Text: = List.Text;
RichEdit1.SelStart: = RichEdit1.FindText (Str, 1, hossz (RichEdit1.Text), []);
RichEdit1.SelLength: = 0;

>
Hogyan juthat el a memo sor számát, ahol a kurzor?
Ehhez meg kell üzenetet küldeni EM_LINEFROMCHAR.
LineNumber: = Memo1.Perform (EM_LINEFROMCHAR, -1, 0);
>

Ugyanezt használják RichEdit.
Határozottan nem esküszöm egyáltalán.

> DDS (05.02.04 14:46) [27]
és még jobb telepíteni MS SQL Server, gyorsan megkeresi


> DDS (05.02.04 14:46) [27]

„Az indexelés tartományok” lehet, műszaki és zavaros persze tedd, de valójában ez egyszerű.

s [1]: = "abc";
s [2]: = "DEF";
s [3]: = "GHI";

építeni egy sor indexek
indexArray: array [1..3] egész szám;
töltse ki az alábbi módon
indexArray [1]: = 1;
i: = 2 vagy 3 do indexArray [i]: = indexArray [i-1] + Hossz * s [i-1] + 1;
Kapok az utolsó index
SetLength (strCommon, indexArray [3] + Hossz (s [3]));
töltse strCommon
i: = 1-től 3 do
kezdődik
Mozgatás (s [i] [1], strCommon [indexArray [i]], Hossz (s [i]));
strCommon [indexArray [i] -1]: = # 13;
végén;
akkor megkapjuk a helyzet a részsztring
nonprofit szervezetek: = Pos (strSubStr, strCommon);
és bináris keresés indexArray (itt nem fog írni, írni is) megadja a sorok számát a forrás tömbben.
faststrings néz az interneten

Azt hittem, valami: (FastString találat)
Hajó lista STRING keresem részkarakterláncként majd rendezni a karakterek a talált helyzetben
1) balra, amíg nem charset érték kezdődő karakterlánc 0Ah
2) jobbra, amíg én charset érték 0Dh soremelés
Két én sor. Sőt, azt fejezte ki egy sort a listából. Kapok az index segítségével indexOf.

40000ms
De edrit-dörömböl régi verzió gyorsabb, mint 5 alkalommal.
Miért van egy új változata a lassabban, mert a művelet egyszerű és ciklusban.

>>>
eljárás TForm1.GetKey (IND: integer);
var i: integer;
s: string;
kezdődik
s: = Drugoi_List [ind]; // töredékszó
k: = - 1;
i: = 0 List.Count-1 do // Csak rendezni
kezdődik
ha pos (s, List [i])> 0 // Talált
Ezután kezdődik k: = i; break; végén;
végén;
végén;

>>>
eljárás TForm1.GetKey (IND: integer);
var i, st_ln, ps: integer;
st, bx: string;
kezdődik
TX: = List.Text; // Load az egész lapot STRING
tx_ln: = hossz (TX); // Nos, a hossza egy
st: = Drugoi_List [ind]; // töredékszó
st_ln: = hossz (st); // és hossza

Kipróbált minden alkalommal ugyanaz a szállítási újság STRING de csak az első.

ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL: ALL! MINDENT!
KÖSZÖNJÜK EMBEREK, JÓ!
Úgy döntöttem, hogy pont ezt a sok, és hagyjuk az előző változat.
Működik rendben. ALL még egyszer köszönöm!

Nagyon helyes pozícióban, a következő Rah, amikor az ilyen programot folyamatosan felbukkanó az AV, és Bassza ALL

Nagyon gyors keresés egyébként keresni memegabaytnyh sok fájl illeszkedik a második.

Kapcsolódó cikkek