Autor | Zpráva | ||
---|---|---|---|
RASik Profil * |
#1 · Zasláno: 11. 4. 2015, 09:49:29 · Upravil/a: RASik
Ahoj,
spíše taková teoretická otázka, lze-li, případně jakým postupem : řekněme, že mám v MySQL - tedy v binárně - vloženy obyčejné textové soubory (txt, csv) Jak vyhledávat řetězce uvnitř jejich obsahu (aniž bych je nějak otevíral)? Děkuji. Pardon, jsem blbej, samozřejmě to jde bežným SQL dotazem např. SELECT nazev_souboru FROM motosoubory WHERE data LIKE '%motor%' ,
jen jsem měl překlep ve skriptu a domníval se, že nemám výsledek... |
||
juriad Profil |
#2 · Zasláno: 11. 4. 2015, 10:23:35
Řetězce pomocí operátoru LIKE, ale bude to ukrutně pomalé; pak existuje REGEX, který je ještě pomalejší.
Slova můžeš vyhledávat pomocí FULLTEXTového indexu, to bude rychlejší, ale neumí to obecné řetězce. Pokud se jedná o řetězce speciálních tvarů, šlo by i něco rychlejšího. CSV by šlo v obyčejné DB rozpadnout do tabulky; pokud bys věděl, ve kterém sloupci chceš hledat, můžeš dost ušetřit. Pokud se přesunu z obyčejné MySQL pryč: Můžeš si doprogramovat do databázového enginu vlastní typ indexu, který bude nějak fungovat na tvé data. Na CSV by šlo indexovat pozice čárek a tedy pak efektivně při hledání poskakovat, za předpokladu, že hledáš od začátku hodnoty. Podobné indexy se používají na JSON a XML. Co vlastně potřebuješ vyhledávat? Pokud jde skutečně o obecný řetězec, je v současné době v praxi asi nejvýhodnější (poměr cena/výkon) HADOOP nakonfigurovaný na nějakém clusteru. Stačí-li ti slova, je dobrou volbou Solr (ať už na clusteru nebo lokálně, pokud je málo dat). Teoreticky(!) bys mohl z celého obsahu databáze postavit suffixový strom, a pak bys vyhledával v čase O(délka hledaného výrazu). Existují už i nějaké cache-oblivious algoritmy, které by mohly fungovat i pro velikosti, které se nevejdou do paměti (nezapomeň na to, že suffixové stromy mají velký paměťový overhead, konstanta je u těch nejlepsích asi tak 16). Tady se bavíme třeba o vyhledávání části řetězce DNA ve velkém množství vzorků (třeba při identifikaci mrtvol nebo stop z místa činu, nebo studium podobnosti druhů). |
||
RASik Profil * |
#3 · Zasláno: 11. 4. 2015, 11:15:03
Ne, opravdu to byla jen teoretická záležitost, nad kterou jsem v tu chvíli "zamyslel" a hned snažil vyzkoušet. Na nic to (zatím?) nepotřebuju, jen se mi v hlavě honilo vyhledání textového řetězce v binárních datech a netušil, že se to dělá "samo".
Pokud bych to v mých podmínkách řešil, tak by šlo asi o to uživateli jen nabídnout, ve kterém souboru se řetězec nachází...zřejmě by ale nešlo o nějaké obrdatabáze ALE zatím ani nehodlám používat DB jako úložiště souborů, i když s tím trochu koketuju nebo spíše si jen "hraju" s možnostmi aneb "nikdy neříkej nikdy" a MOC DĚKUJU za kvalifikované zamyšlení, třebas to nakopne i někoho jiného... |
||
Časová prodleva: 11 let
|
0