Porovnávanie riadkov súborov (10 000 a viac) – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Porovnávanie riadkov súborov (10 000 a viac) – .NET – Fórum – Programujte.comPorovnávanie riadkov súborov (10 000 a viac) – .NET – Fórum – Programujte.com

 

yterbium0
Stálý člen
3. 3. 2010   #1
-
0
-

zdravím,

mám 2 súbory .txt viac ako 10 000 riadkové, pekne si ich načítam do List<string>, a napísal som si takýto algoritmus, ktorý kontroluje, či sa riadok v prvom súbore nachádza aj v druhom.

Ak sa nenechádza, tak zvyši počet riadkov nenachádzajúcich sa:

foreach (string line in prvyKomplex)

{
foreach (string riadkyDruhe in druhyKomplex)
{
if (line == riadkyDruhe)
{
exists = true;
}
}

if (!exists)
{
riadkovNenachadzajucich++;

}
exists = false;
}


Algoritmus mi funguje správne a pekne. Ale otázka znie:

Dá sa to nejakým "lepším" algoritmom ZRYCHLIT?

Vopred díky

Nahlásit jako SPAM
IP: 158.195.206.–
velurex0
Stálý člen
3. 3. 2010   #2
-
0
-

Pro začátek alespoň tím, že za

exists = true;
přidáš
break
. Lépe ovšem indexování - tj. rozdělením řádků do skupin dle počátečních N znaků řetězce. Pak prohledáš vždy jen příslušnou skupinu a když není shoda tam, není vůbec. Už od N=1 uvidíš výrazné zrychlení, pro 2 nebo 3 to bude jako blesk. :smile1:

Nahlásit jako SPAM
IP: 213.191.119.–
3. 3. 2010   #3
-
0
-

Je opravdu potřeba procházet řádek po řádku, abys mohl soubory porovnat? Nebylo by lepší spočítat hashe daných souborů?

Nahlásit jako SPAM
IP: 88.100.81.–
Dušan Janošík | web: djanosik.cz, @djanosik
KIIV
~ Moderátor
+43
God of flame
3. 3. 2010   #4
-
0
-

To djanosik : hash table by to hledani docela urychlila.. ostatne i hledani podle ciselneho hashe by to popohnalo.. pokud by tam nebyly kolize

Nahlásit jako SPAM
IP: 80.250.1.–
Program vždy dělá to co naprogramujete, ne to co chcete...
yterbium0
Stálý člen
3. 3. 2010   #5
-
0
-


JJ, ten break tam mám, je tam ešte niečo, čo spracúvava ten riadok, zabudol som dokopírovať to break.

Potrebujem to po riadku, lebo následne tie riadky musím spracovať a rozdeliť na tie ktoré sa nachádazjú a tie ktoré nie a pokračovať len s tými čo sa nenachádazjú.

MD5 mi vráti len hodnotu súboru, to asi nepôjde aj na riadky, však?

Lépe ovšem indexování - tj. rozdělením řádků do skupin dle počátečních N znaků řetězce. Pak prohledáš vždy jen příslušnou skupinu a když není shoda tam, není vůbec. Už od N=1 uvidíš výrazné zrychlení, pro 2 nebo 3 to bude jako blesk. :smile1:



Toto ma zaujalo, len neviem si predstaviť, ako to rozdeliť do tých "skúpin", mohol by si mi to trochu viac vysvetliť/ukážku kodu
díky

Nahlásit jako SPAM
IP: 158.195.206.–
velurex0
Stálý člen
4. 3. 2010   #6
-
0
-

Při načítání souboru nesypeš řádky do jednoho velkého List<string>, ale máš zvlášťList<string> pro všechny znaky začínající "AA", zvlášť pro "AB"... až "ZZ" (když předpokládám že jsou tam jen písmena a N=2).
Když pak chceš zjistit jestli soubor obsahuje "AHOJ", pouze prohledáš List<string> s řetězci začínající na "AH".
Urychlení bude odhadem v řádech stonásobků - záleží na konkrétních datech.

Nahlásit jako SPAM
IP: 213.191.119.–
yterbium0
Stálý člen
4. 3. 2010   #7
-
0
-

No len to, čo získam pri porovnávaní, statím pri načítavaní súboru, lebo musím kontrolovať čím začína nový riadok.

Ale celkovo som sa zbavil List<>, a urýchlilo sa mi to.

String textak = stream.ReadToEnd();
string[] riadkz = Regex.Split(textak, "\r\n");
foreach...



Toto mi skrátilu dobu od načítavania , na menej než polovicu v priemere. Takže to mi momenátlne plne postačuje :-)

Ale díkes za to "indexovanie", raz to určite skúsim

Nahlásit jako SPAM
IP: 158.195.80.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Podobná vlákna

Poradie riadkov — založil m.czech

PHP, vypísanie riadkov — založil Anonymní uživatel

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý