Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Python3 ja tallennuskeinot

ohjelmaohjelma [06.12.2021 08:30:55]

#

Hei taas. Toivottavasti minua ei kohta pidetä ongelmana, kun alvariinsa täällä kyselen kaikenlaista:-)

Minulla on siis pieni ohjelma, joka on tehnyt paljon kansioita ja niissä on sisältönä kooltaan hyvin pieniä .xlsx .jpg .pdf .txt tiedostoja, mutta niitä on paljon. Kooltaan ohjelma tiedostoineen on 386 MiB. Tein niin, että kun sammutan ohjelman, niin se kopio itsensä "shutil.copytree" toiminnon avulla.

Ongelma on siinä, että kun ohjelma tekee kopion muistitikulle, niin siinä menee noin tunnin verran aikaa. Joskus voi jopa käydä niin, että koko toiminto pysähtyy virheeseen puolen tunnin jälkeen, mutta onneksi tosi harvoin.

Miten siis saisin tehtyä kopiot nopeammin, vaikka sitten ilman automaatiota. Mikäli nyt joku sanoo, että olen tehnyt jo alunperin kaiken väärin, kun olen tallentanut asioita näissä muodoissa, niin sille en voi nyt mitään.

Kyse on pohjimmiltaan siis varmuuskopion tekemisestä, eikä sitä tarvitsisi käyttää kuin erikoistilanteissa. Voisiko jonkinlainen pakkaaminen tulla kyseeseen, vai mitä teen?

Siis kyse oli Python3, linux ja Tkinter.

Kiitos.

Metabolix [06.12.2021 09:25:31]

#

Pakkaaminen (zip tai tar.gz tai jopa pelkkä tar-paketti ilman pakkausta) on sikäli toimiva vaihtoehto, että ensinnäkin pienet tiedostot vievät levyllä usein hukkatilaa ja toiseksi pienten tiedostojen kirjoitus USB-tikulle voi olla olennaisesti hitaampaa kuin yhtenäisen ison tiedoston kirjoitus. Tähän olisi shutil.make_archive lähes suora korvaaja nykyiselle koodillesi.

Toinen ratkaisu on, että kopioit vain viime kerrasta muuttuneet tiedostot, ettei tarvitse turhaan kopioida samoja asioita joka kerta uudestaan. Hyvä valmis työkalu tähän on rsync-ohjelma. Uusien kopiointi ilman vanhojen poistoa menisi vaikka seuraavasti:

rsync -aHAXuPs lähde/ kohde

ohjelmaohjelma [06.12.2021 13:36:18]

#

Hei ja kiitos viestistäsi. Voitko katsoa alla olevaa koodia. Nyt kun tällainen mahdollisuus siis on "rsync", niin heti tuli mieleeni, että voisiko sen käynnistää pythonilla3. Ennen kuin kokeilen, niin kysyisin mielipidettä, että toimisiko tuo suoraan. En ihan hirveästi ymmärtänyt, mutta tämä kai tekee kopioinnin lisäksi jonkinlaisen lokitiedoston??

import datetime
import subprocess

def Copy_Logs():
    Sourcedir = datetime.datetime.now().strftime("/data1/logs/%B/%b_%d_%y/")
    Destdir = "/data2/logs/"
    subprocess.call(['rsync', '-avz', '--min-size=1', '--include=*.txt', '--exclude=*', Sourcedir, Destdir ])

Metabolix [06.12.2021 17:32:10]

#

Siinä mielessä koodi ”toimii suoraan”, että subprocess.call käynnistää toisen ohjelman, kuten voi arvata tuosta tai lukea Pythonin ohjeista.

Muilta osin koodi ei toimi suoraan, koska rsync-komennon parametrit ovat täysin väärät. Muutaman englanninkielisen sanan ymmärtämällä voi ihan suoraan lukea, mitä tapahtuu: Koodi kopioi lokitiedostoja (Copy_Logs), lähdekansio (Sourcedir) valitaan tämänhetkisen ajan (datetime.now) perusteella, ja kohdekansio (Destdir) on aina sama. Kopiointiin otetaan mukaan (include) *.txt-tiedostot ja jätetään pois (exclude) kaikki muut tiedostot.

rsync-komennon osalta tässä on vain muutama looginen vaihtoehto:

a) Kokeile sitä komentoa, jota ehdotin.

b) Lue rsyncin ohjeita niin, että pystyt itse valitsemaan oikeita parametreja. Linuxin käyttäjänä ja ohjelmoinnin harrastajana kannattaa tietää, että komentoriviohjelmien ohjeita löytyy sanalla man (niin kuin manual), esimerkiksi man rsync = rsyncin ohjeet. Kyseessä on hyvin monipuolinen ohjelma, joten lähtökohtaisesti kannattaa ensin kokeilla ihan yksinkertaista komentoa, ja jos sitten omassa tilanteessa on jotain poikkeuksellista huomioitavaa, voi etsiä siihen sopivaa rsync-parametria.

c) Lue ohjeita tai edes englantia sen verran, että ymmärrät, mitä kopioit netistä. Siinä ainakaan ei ole järkeä, että kopioit satunnaisia palasia tänne ja kysyt, mitä tämä edes tekee ja olisiko tämä sopiva omaan tilanteeseesi (jota et ole edes kovin tarkkaan kuvaillut).

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta