Motorola srecord file mit 32Stellen pro Zeile einlesen

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
Django Unchained
User
Beiträge: 5
Registriert: Dienstag 2. März 2021, 16:23

Hi,
ich versuche einzelne Zeilen einer etwas größeren S-Records Datei einzulesen, allerdings stürzt der 12GB Ram sehr schnell ab, deshalb die Frage ob irgendjemand einen weit aus effizienteren Weg dafür kennt.

Hier mein derzeitiger Code:
for i in range(100):
k=''
lines_to_read=[]
zetta=startline
fileObj = open('file.srec', "r")
for i in range (startline, endline):
lines_to_read.append(zetta)
zetta+=1
for position, line in enumerate(fileObj):
if position in lines_to_read:
t=str(line)
for j in range (12, 43):
n+=t[j]
t=''
k+=n
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Eingerückt wird immer mit 4 Leerzeichen pro Ebene. Leerzeichen um = bzw. += helfen auch der Lesbarkeit.
Dateien öffnet man immer mit dem with-Statement, damit sie auch sicher wieder geschlossen wird.
Man definiert nicht Variablen (k, fileObj) etliche Zeilen bevor sie gebraucht werden.
`line` ist schon ein String, das nochmal in einen String zu verwandeln ist überflüssig.

Kommen wir also zu:

Code: Alles auswählen

for i in range(100):
    lines_to_read = []
    zetta = startline[i]
    for i in range (startline[i], endline[i]):
        lines_to_read.append(zetta)
        zetta += 1
    k = ''
    with open('file.srec', "r") as lines:
        for position, line in enumerate(lines):
            if position in lines_to_read:
                for j in range(12, 43):
                    n += line[j]
                k += n
`zetta` ist überflüssig, denn das hat ja immer exakt den selben Wert wie `i`, bzw. `i` kann man auch durch `zetta` ersetzen:

Code: Alles auswählen

    lines_to_read = []
    for zetta in range(startline[i], endline[i]):
        lines_to_read.append(zetta)
So eine for-Schleife ist aber nichts anderes als ein `list`-Aufruf:

Code: Alles auswählen

    lines_to_read = list(range(startline[i], endline[i]))
Jetzt brauchst Du aber gar keine Liste, sondern kannst genauso gut mit dem range-Objekt arbeiten:

Code: Alles auswählen

    lines_to_read = range(startline[i], endline[i])
Die innerste for-Schleife über j ist genauso überflüssig, weil Du da einfach mit slicing arbeiten kannst:

Code: Alles auswählen

for i in range(100):
    lines_to_read = range(startline[i], endline[i])
    k = ''
    with open('file.srec') as lines:
        for position, line in enumerate(lines):
            if position in lines_to_read:
                n += line[12:43]
                k += n
Jetzt ist eine Schleife über einen Index ein anti-Pattern, weil man über startline und endline auch direkt iterieren kann:

Code: Alles auswählen

for start, end in zip(startline, endline):
    k = ''
    with open('file.srec') as lines:
        for position, line in enumerate(lines):
            if start <= position < end:
                n += line[12:43]
                k += n
So ist der Code schon deutlich übersichtlicher, und dann sieht man auch gleich das Problem:
Du hast eine Variable `n` die immer weiter wächst und eine Variable `k`, die noch viel stärker wächst, würde sie nicht in jedem Schleifendurchgang wieder geleert werden.
Mit `k` machst Du nichts. Und was Du mit `n` machst, ist wohl ungewollt.
Ungeschickt ist auch, dass Du die gesamte Datei hundert mal komplett liest, nur um ein paar Zeilen herauszuholen.
Um das lösen zu können, müßte man jetzt wissen, was Du wirklich machen willst. Sind startline-endline jeweils nicht überlappend und/oder monoton ansteigend?
Antworten