Große Textdatei in einem Thread auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

hi
ich habe einen code geschrieben, mit dem sich eine große textdatei (3GB) auslesen und in eine Datenbank abspeichern läßt (läuft).
nun würde ich gern den code im hintergrund laufen lassen können, damit ich während dessen (dauer ca. 1,5 tage!) das programm auch anderweitig
nutzen kann.
für den anfang habe ich mir dazu erst einmal einen kleinen code aus dem netz besorgt, der einen text aus einer textdatei (source_filename) ausliest und in eine andere datei kopiert (target_filename), besorgt und etwas abgeändert.

Code: Alles auswählen

import threading
from Queue import Queue

source_filename = "source.txt"
target_filename = "target.txt"

worker_queue = Queue()
finished = object()

def read():

    with open(source_filename) as source:
        for line in source:
            queue = Queue()
            queue.put(line)
            worker_queue.put(queue)
    worker_queue.put(finished)

    with open(target_filename, 'w') as target:
        for output in iter(worker_queue.get, finished):
            target.write(output.get())

thread = threading.Thread(target = read)
thread.start()
warum wird der text nicht in die textdatei Target.txt kopiert?
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: kannst Du mir erklären, was Du im einzelnen bei den Zeilen Code gedacht hast, ich verstehe es nämlich überhaupt nicht. Was ist der Sinn, für jede Zeile eine neue Queue zu erzeugen?

Für Aufgaben, die in sich abgeschlossen sind, nimmt man ein eigenes Programm und versucht nicht, ein schon existierendes so zu erweitern, dass im Hintergrund etwas gemacht wird.

1,5 Tage hört sich für mich etwas lang an, 1,5 Stunden wären realistischer. Was tust Du genau? Was willst Du im Hintergrund und im Vordergrund tun?
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

es geht also nur um den code den ich oben dargestellt habe.
ich versuche IN EINEM THREAD einen text aus einer textdatei "source.txt" auszulesen und in eine ANDERE textdatei "target.txt" zu schreiben.
wie ich eben erst bemerkt und dann auch öfter kontrolliert habe, ist, daß der code den ausgelesenen text auch in die neue datei schreibt, aber irgendwie vergeht sehr viel zeit. ich verstehe nur nicht weshalb soviel zeit (ca. 15-20 min) vergeht?
keine ahnung wie ich das sonst erklären soll.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: es geht ja sehr wohl darum, ob Dein Vorhaben überhaupt sinnvoll ist. Da kannst Du viel Zeit sparen.

Du mußt Dir ja was dabei gedacht haben, Queues zu benutzen. Wenn Du diese Frage beantworten kannst, dann ist Dein Problem schon fast gelöst.
DMD-OL
User
Beiträge: 327
Registriert: Samstag 26. Dezember 2015, 16:21

naja, wie schon oben erwähnt:
ich habe einen code schnippsel im netz gefunden und mich daran versucht.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@DMD-OL: an dem Code-Schnippsel ist nichts, woran man irgendetwas lernen könnte. Daher nochmal die Frage: was willst Du machen?
Benutzeravatar
kbr
User
Beiträge: 1508
Registriert: Mittwoch 15. Oktober 2008, 09:27

@DMD-OL: auch ich weiß nicht was Du vorhast (das mit der Queue ist wirklich gruselig), aber was Du möglicherweise brauchst, könnte sowas sein:

Code: Alles auswählen

with open(source) as infile, open(target) as outfile:
    for line in infile:
        result = do_something_with(line)
        outfile.write(result)

Wenn Du, während dieses Programm läuft, etwas anderes machen möchtest, dann startest Du eben das andere Programm, mit dem Du was anderes machen möchtest.

Vor Codeschnipseln, die man im Netz gefunden hat, sollte man vorsichtig sein. Obgleich Du dieses hier letztlich auch im Netz gefunden hast ... 8)
Benutzeravatar
noisefloor
User
Beiträge: 4208
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
damit ich während dessen (dauer ca. 1,5 tage!) das programm auch anderweitig nutzen kann.
Welches Programm?

Statt Thread würde ich hier auch eher einen Prozess nehmen... Oder du nimmst ein fertiges Framework für Hintergrundprozesse wie z.B. Celery.

Abgesehen davon erscheint mir 1,5 Tage für 3 GB lesen und schreiben extrem lahm... Das währen (falls ich mich nicht verrechnet habe) schlappe 83 MB/Stunden. Da stimmt IMHO noch was anderes nicht...

Gruß, noisefloor
Antworten