Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  3 984
Heisann!
Er i startfasen på et prosjekt hvor jeg skal ha et lokalt program som snakker
med en web server. Du søker opp ting via programet og får en liste med svar tilbake fra serveren. Litt slik som spotify, men dette har ikke med musikk å gjøre.

På serveren vil det ligge mange filer og disse skal du kunne søke opp med tags. Tenkte i utgangspunktet å lage et python script som tok imot requests på server, sendte requesten videre til mysql, som igjen sender svar tilbake til python, så tilbake til klienten.

Har brukt en del mysql før, men har hatt store problemer med å få det til å instalere på maskinen her, så begynte å forske litt på å droppe mysql helt å gjøre dette med søkefunksjoner i python. Så jeg opprettet 20 000 tekst filer som har random navn med 50 tegn og gikk igjennom filene slik:

Kode

def findInFiles(query):
    files = os.listdir(Path)
    matches = []
    for file in files:
        for q in query:
            if file.find(q) != -1:
                matches.append(file)
    return matches
Så kjørte jeg testen slik

Kode

def runTestPython():
    StartTime = time.clock()
    Result = findInFiles(['22043', '99234', '50035', '32423'])
    for file in Result:
        getInfoFromFile(Path + os.path.sep + file) #getInfoFromFile leser texten i filene som er funnet.
    EndTime = time.clock()
    Elapsed = EndTime - StartTime
    print Elapsed
Svaret jeg får er etter å ha kjørt testen en del ganger er at det tar ca 0.03 sek å søke igjennom 20 000 filer med 4 tags som query.
Dette er mer en bra nok for meg, kommer trolig aldri til å ha mer en 10 000 filer, men det føles alikevel feil å gjøre det slik da alle bruker databaser til slike opperasjoner. Er det en god grunn til å heller bruke mysql en ren python?
Sitat av kidz Vis innlegg
Svaret jeg får er etter å ha kjørt testen en del ganger er at det tar ca 0.03 sek å søke igjennom 20 000 filer med 4 tags som query.
Dette er mer en bra nok for meg, kommer trolig aldri til å ha mer en 10 000 filer, men det føles alikevel feil å gjøre det slik da alle bruker databaser til slike opperasjoner. Er det en god grunn til å heller bruke mysql en ren python?
Vis hele sitatet...
Overraskende kjapt. Jeg ville gjettet at den brukte mer tid bare på å gå gjennom katalogen(e) og finne disse 20k filene. Men hvis testfilene er representative og dette er kjapt nok uten at maskina di kneler, så nok ser jeg ingen grunn til å fikle mer med saken.

Hvis du absolutt vil/må gjøre det ordentlig, så er "riktig" måte å indeksere innholdet i en motor for fulltekst-søk, a la Apache Lucene (det finnes sikkert en implementasjon i Python, eller ihvertfall ferdige bindinger), og gjøre søkingen med biblioteket.
Indeksene vil nok ta opp litt plass, men søket skal bruke langt mindre cpu og IO, og dermed gå mye raskere.

Dette er beste praksis for litt større datamengder, uansett om dataene dine ligger på fil, web eller i en database. Google "<rdbms of choice> full text search vs lucene" for en bekreftelse eller 100.


Forøvrig bør man aldri bruke MySQL, men det er nok et emne for en annen tråd..
memcached er også fint for slike søk. Men du får skrive en test som søker med flere tråder. fks 200 tråder som går å søker på samme disken. da mister du nok performance.

om det skal være en webapp, er jo det realistisk...
Trådstarter
Fant ut jeg måtte ha mulighet til å gjøre en del mer rafinerte søk så endte med å bruke sqlite. Det hadde nok gått treigt med mange tråder ja.
Til sammenligning gjør sqlite et lignende søk på 0.003 sek men var overasket over hvor raskt et søk igjennom 20 000 filer gikk.
Ble nesten inspirert til å skrive en slags portable database av "fysiske" kataloger du kan søke i som inneholder filer feks en web server som skal lever ut. Meeen tror det får bli sittende på ide stadiet en god stund til.
Foresten Lucene så veldig interesant ut. Takk for tipset.