[Python] Kennis gezocht
Misschien dat dit topic thuis hoort in de koffiehoek, maar een tijd geleden ben ik begonnen met Python omdat ik een executable wou hebben die mij helpt met mijn werk. Hierin ben ik mij gaan verdiepen en heb een hele stap gemaakt, maar ik kom duidelijk kennis te kort om het programma vloeiend en vlekkeloos te laten lopen (Is langzaam, freeze momenten, etc).
Zijn er hier mensen die gevorderde kennis hebben van Python en mij hiermee willen helpen?
Ik vraag het hier omdat ik tot nu toe alleen engelse forums kan vinden (Stack***, Dani***) en dit toch de communicatie lastig maakt.
Er staat eventueel een vergoeding tegenover, maar ik wil er ook zelf van leren dus niet compleet uit handen geven.
Michael
*schop*
Links naar Nederlandse fora's mag ook.
Een forum van hoog niveau die je kan raadplegen is Gathering of Tweakers. Daar zitten veel experts die vast en zeker advies kunnen geven.
Immers, we zitten hier met z'n allen om iets te leren en kennis over te brengen. :)
Mijn kennis van python is niet gevorderd maar interesse in problemen/puzzels oplossen is er uiteraard wel.
Ik kan me bijna niet voorstellen dat er niet meer mensen hier rondkijken die enig kennis heeft van python.
Dus, suggestie: kom met relevante code en probleem. (Tis net een php vraagstuk)
activiteiten?)
@Bart, Omdat dit een PHP forum is. Vragen over gerelateerde zaken als HTML, CSS, JS, SQL is daar aan toe, maar Python valt wel naast de boot lijkt mij ;-)
Even de code tonen is geen optie. Het programma werkt en het is niet zozeer dat ik ergens vast loop, maar ik wil het optimaliseren en daarin komt mijn kennis te kort (heb alleen wat video tutorials gevolgd).
Om er toch even verder op in te gaan, mocht je (of iemand anders hier) misschien kunnen helpen;
In het programma kies je een map met bestanden en deze worden vergeleken met een map afbeeldingen.
Die map met afbeeldingen bevat 175.252 bestanden in 385 mappen met een grootte van bijna 3.8 GB.
Om de snelheid te verhogen heb ik een configuratie scherm waarin ik aanvink in welke mappen deze moet zoeken (lang niet alle mappen zijn van toepassing) en dit wordt opgeslagen in een configuratie bestand.
Dus het programma zoekt in de mappen die zijn aangevinkt en als er overeenkomsten zijn worden deze afbeeldingen als een soort van galerij weergegeven in een nieuw venster. Onder de afbeeldingen staat de naam van het bestand en er moet nog een link naar een PDF aan worden toegevoegd (als deze beschikbaar is).
Toevoeging: Ook moeten de bestanden waarvan geen overeenkomst is worden getoond in een lijst (onderaan de gallerij bijvoorbeeld)
Op het moment dat ik start met zoeken opent een nieuw venster en deze bevriest voor heel wat seconden (ik hebt een limiet van afbeeldingen nu verkort om geen minuten te hoeven wachten).
Dit bevriezen wil ik voorkomen en ik wil het zoeken sneller maken. Het zoeken wordt ook vertraagd omdat de afbeeldingen op een server staan dus misschien dat het handig is deze, wanneer een overeenkomst is, te downloaden op de lokale schijf zodat deze de volgende keer sneller wordt weergegeven.
Het programma is dus in principe bijna klaar maar er is niet mee te werken ;-)
@Arien, Bedankt voor je advies! (Wist je trouwens dat je naam niet wordt weergeven in @Bart, Omdat dit een PHP forum is. Vragen over gerelateerde zaken als HTML, CSS, JS, SQL is daar aan toe, maar Python valt wel naast de boot lijkt mij ;-)
Even de code tonen is geen optie. Het programma werkt en het is niet zozeer dat ik ergens vast loop, maar ik wil het optimaliseren en daarin komt mijn kennis te kort (heb alleen wat video tutorials gevolgd).
Om er toch even verder op in te gaan, mocht je (of iemand anders hier) misschien kunnen helpen;
In het programma kies je een map met bestanden en deze worden vergeleken met een map afbeeldingen.
Die map met afbeeldingen bevat 175.252 bestanden in 385 mappen met een grootte van bijna 3.8 GB.
Om de snelheid te verhogen heb ik een configuratie scherm waarin ik aanvink in welke mappen deze moet zoeken (lang niet alle mappen zijn van toepassing) en dit wordt opgeslagen in een configuratie bestand.
Dus het programma zoekt in de mappen die zijn aangevinkt en als er overeenkomsten zijn worden deze afbeeldingen als een soort van galerij weergegeven in een nieuw venster. Onder de afbeeldingen staat de naam van het bestand en er moet nog een link naar een PDF aan worden toegevoegd (als deze beschikbaar is).
Toevoeging: Ook moeten de bestanden waarvan geen overeenkomst is worden getoond in een lijst (onderaan de gallerij bijvoorbeeld)
Op het moment dat ik start met zoeken opent een nieuw venster en deze bevriest voor heel wat seconden (ik hebt een limiet van afbeeldingen nu verkort om geen minuten te hoeven wachten).
Dit bevriezen wil ik voorkomen en ik wil het zoeken sneller maken. Het zoeken wordt ook vertraagd omdat de afbeeldingen op een server staan dus misschien dat het handig is deze, wanneer een overeenkomst is, te downloaden op de lokale schijf zodat deze de volgende keer sneller wordt weergegeven.
Het programma is dus in principe bijna klaar maar er is niet mee te werken ;-)
Gewijzigd op 08/07/2016 14:26:44 door Michael -
Je hebt het over ruim 175.000 bestanden in 385 mappen ... en die staan ook nog eens op een server. Dan lijkt het mij niet zo heel raar dat de boel vastloopt. Is het een idee om niet de bestanden zelf te doorzoeken, maar alle bestandsnamen in een database te zetten en dan die database te doorzoeken? In plaats van 175.000 relatief zware file-bewerkingen uit te voeren, ben je dan met het uitvoeren van 1 query wellicht al klaar. Misschien een idee? En zodra je dan een plaatje erbij zet op de server, dan laat je ook automatisch de titel aan de database toevoegen.
Quote:
Vragen over gerelateerde zaken als HTML, CSS, JS, SQL is daar aan toe, maar Python valt wel naast de boot lijkt mij ;-)
Naja, Python doet het best goed met html, CSS e.d, zelfs een een webserver er mee maken kan.. ;)
Dus op zich is een python vraag nog niet eens zo zeer buiten de boot.
Om even wat beter een beeld te krijgen, begrijp ik het goed dat je mappen met plaatjes (highres) uitleest, en deze uitpoept op je scherm?
In dat geval zou een database misschien handig zijn, hoewel dat weer lastig is te combineren met een standalone programma. Misschien een sqlite database een optie?
Andere optie is om de plaatjes in een laag resolutie te zetten en deze te vergelijken op het moment dat je die nodig hebt en dan ermee te doen wat je wenst. (soort van cache)
Het is maar even in theorie he.
Met PHP zou je dan een cronjob kunnen doen, maar met een executable zou je dat dan pas op het moment kunnen doen dat het programma word geopend, wordt ook de boel vertraagd. Dan zou ik weer een programmaatje in de achtergrond moeten draaien die af en toe die taak uitvoert of zo.
@Bart; Dat klopt, het is wel een server taal ;-)
De plaatjes zijn gelukkig niet highres. De plaatjes zijn tussen de 10 en 36 kb ongeveer. Het zijn namelijk al thumbnails en dat is voldoende. Wat is de beste manier om een database/cache achtig iets te maken waarin die dan kan zoeken? Dan gaat het zoeken i.i.g. al snel, dan moeten alleen de plaatjes nog worden geladen. Maar als ik de structuren van de eerste map en de tweede map in een database heb en deze eenvoudig kan updaten, zou dit denk ik al een hoop schelen.
http://sebastianraschka.com/Articles/2014_sqlite_in_python_tutorial.html
Ik zou denk ik in dit geval sqlite inzetten.
Dit kan lokaal gebruikt worden, en is immer enkel bedoeld om je zoeken sneller te maken.
Je kan het database bestand dan overal gebruiken. Kwestie van copy/past.
Het tweede punt is dan hoe update ik het bestand, wanneer maak ik die database aan (Bij het openen van het programma? Gelijk updaten? Is dit niet alsnog traag? Of via een apart programmaatje updateDatabase.exe waarin ik ook de nieuwe paden kan toewijzen, want van de eerste map verandert deze (nieuwe datum in de naam). Het wordt nog wel een hele opgave voor iemand die nog maar een paar weken hiermee werkt ;-) Hoever is jouw ervaring en kennis en heb je al leuke projecten gemaakt? Misschien dat je me wil en kan helpen met dit project.
Ik heb een orange pi gekocht om daarmee uiteindelijk een python applicatie te maken om mijn aquarium mee te monitoren. Vooral het GPIO verhaal vind ik erg interessant omdat daar sensoren e.d. op aangesloten kunnen worden. Dat werkt in python erg makkelijk. Mijn eerste gedachte is/was om het webbased te maken, maar nu ik dit topic zo zie en ook het idee van sqlite erbij benoem is het misschien niet eens zo'n slecht idee om een stand alone programma te maken. ;) Dus jou vragen brengen mij op creatieve ideeën.
Overigens heb ik verder nog niet echt iets concreets gemaakt met python, uitsluitend mee gespeeld.
Maar goed, even naar jou topic terug:
Sorry dat ik even doorvraag, maar is het een idee om op de server sqlite te zetten?
Want dan zou je met een cronjob via een simpel script (python?) het updaten van je database bestand al kunnen oplossen.
Je zou dan het database bestand kunnen kopiëren naar je eigen pc.
Volgens mij kan je met python iets van ftplib om een optie te hebben ala ftp iets op te halen, dus dan zou je alleen in de applicatie bij opstarten de nieuwe database hoeven downloaden.
https://docs.python.org/3.0/library/ftplib.html
voor versie 2.7 (weet niet welke je gebruikt) kan je 3.0 in de link veranderen naar 2.7 :)
Willen helpen altijd, alleen kunnen helpen is qua tijd wat lastiger.
Vragen beantwoorden/meedenken kan altijd he. :P
Het programma moet draaien op de PC van het werk dus ik heb geen mogelijkheden om hier in het bedrijf een server hiervoor te gaan opzetten. Online kan natuurlijk ook niet, want dan heb ik geen toegang tot de schijf waar de afbeeldingen op staan. Het zou dus vanaf de pc moeten waarop het programma draait. Eventueel een background-process o.i.d.
Misschien is je ingeving met een aparte applicatie om te updaten dan nog niet eens zo slecht bedacht.
Dat in de achtergrond laten doen is een optie. Ik neem aan dat het niet in real time hoeft te bekijken of er nog iets nieuws is. Dan hoeft het niet eens met een stand alone applicatie te zijn.
Als je een python script maakt die dat doet:
Bestanden bekijken/vergelijken -> database updaten
dan kan je eventueel het met een cronjob oplossen.
Je uiteindelijke applicatie om de dingen te bekijken e.d. is al klaar. Alleen aan de database koppelen is dan nog nodig.
Gewijzigd op 08/07/2016 20:00:13 door Bart V B
Ik ben nog eens aan de slag gegaan met dit project en heb intussen een updater.py met 3 entry's waarin je de gewenste directory kiest en deze gegevens worden vervolgens in een sqlite database opgeslagen.
Nou was ik heel erg aan het struggelen met INSERT en UPDATE in een glob-loop (UPDATE als bestandsnaam bestaat anders INSERT). Dit werkt goed, maar duurt erg lang omdat een insert wordt gedaan, bestand gesloten, bestand geopend, insert, bestand sluiten, etc. en dat meer dan 2000 keer voor 1 directory (de 2e is nog veel groter) :-) Nou vond ik iets over BEGIN en END TRANSACTION of een executemany.
Er kan dan gewoon DELETE FROM *TABLE* en VACUUM worden gedaan (TRUNCATE kennen ze niet :-)) en dan weer gevuld worden.
Nou ben ik bezig met executemany, wanneer ik eerst een dictonary maak van de glob en deze wil ik dan in een keer uitvoeren, maar tot mijn grote ergernis wil dit nog niet werken. Heb jij hier enige ervaring mee of ben je bereid mee te helpen/denken? Vanavond kan ik hier wel wat code plaatsen.
Gewijzigd op 05/08/2016 12:03:15 door Michael -
Hoe wil je in/door deze afbeeldingen kunnen zoeken? Welke criteria gebruik je? En wat ben je uiteindelijk aan het maken - een soort van fotogalerij, een archief, iets anders? Moet dit een standalone applicatie zijn? Hoe vaak verandert de samenstelling van deze collectie en hoe ingrijpend (met name als je sqlite gebruikt, als je overwegend uit de database leest kan dit efficiënt zijn maar als je ook veel schrijft dan is sqlite wellicht toch niet zo'n verstandige keuze)? Ik kan mij er geen voorstelling van maken.
Je komt ook een beetje via de zijdeur binnen met de vraag om Python-kennis. Niet zozeer omdat dit voornamelijk een PHP-forum is maar meer omdat je er verder weinig tot niets bijvertelt :p.
Wij maken machine programma's en slaan deze op onder een nummer. Dit nummer zou terug moeten keren, maar het gebeurt nog al eens dat het programma een nieuw nummer krijgt waarna we het programma omdat moeten maken want we weten niet meer onder welk nummer die is opgeslagen.
Van deze programma's wordt ook een thumbnail gemaakt en zijn te vinden op de server. Hier zijn er nu meer dan 175.000 van. (Dit betekent niet dat deze moeten worden weergegeven, dat blijft beperkt tot tientallen).
Aangezien het programma en de thumbnail allebei dat nummer als naam hebben dacht ik die eenvoudig aan elkaar te kunnen linken en weer te geven.
Dit eerste programma was totaal niet bruikbaar omdat het heel erg lang duurde voordat er een aantal afbeeldingen waren geladen. Met meer dan 20 afbeeldingen liep het compleet vast.
Naar een aantal maanden heb ik de ijskast weer open getrokken en ben ik nu bezig dit programma te splitsen.
Er komt een updater en een viewer. De updater slaat de bestanden in de programma map op in een database, slaat de afbeeldingen op in een database en zou vervolgens relaties moeten opslaan in de database. Deze relaties wil ik dan weergeven in de viewer.
Toevoeging op 05/08/2016 15:49:30:
De gegevens hoeven niet vaak geüpdatet te worden. Eens per maand/half jaar is prima. Ook sqlite kan, wat ik gelezen heb, makkelijk tienduizenden records in een seconde toevoegen, maar dan zou het dus wel met een transaction of executemany moeten gaan, maar mijn eigen kennis hiervan is 0,1 dus het is vooral wat ik lees en door het te doen.
Quote:
Nou ben ik bezig met executemany, wanneer ik eerst een dictonary maak van de glob en deze wil ik dan in een keer uitvoeren, maar tot mijn grote ergernis wil dit nog niet werken. Heb jij hier enige ervaring mee of ben je bereid mee te helpen/denken? Vanavond kan ik hier wel wat code plaatsen.
Laat eens wat code zien..
Totaal geen ervaring mee, maar houd wel van een stukje puzzelen.
En we leren er ook weer wat van.
Bart V B op 06/08/2016 09:45:20:
Laat eens wat code zien..
Totaal geen ervaring mee, maar houd wel van een stukje puzzelen.
En we leren er ook weer wat van.
Totaal geen ervaring mee, maar houd wel van een stukje puzzelen.
En we leren er ook weer wat van.
Ik heb de hele code van de updater in pastebin gezet.
Het gaat in dit geval dan over regel 241-243
237-252 is hoe ik het op dit moment doe, maar ik wil dus kijken of er nog snelheidswinst te halen is met executemany of transactions.
De fout die ik krijg met regel 241 en 243 is:
Quote:
TypeError: function takes exactly 2 arguments (1 given)
De fout die ik krijg met regel 242 is:
Quote:
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 3 supplied.
Quote:
TypeError: function takes exactly 2 arguments (1 given)
Dan kom ik hier uit.
Waarschijnlijk heeft de fout van regel 242 met regel 241/243 te maken. Hopelijk heb je hier wat aan.
Wel ben ik wijzer geworden dat sqlite automatisch transactions toepast en ook automatisch commits uitvoerd. Ik heb daarom de commits verwijderd en het wegschrijven gaat nu in één keer.