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
Motorola srecord file mit 32Stellen pro Zeile einlesen
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:
`zetta` ist überflüssig, denn das hat ja immer exakt den selben Wert wie `i`, bzw. `i` kann man auch durch `zetta` ersetzen:
So eine for-Schleife ist aber nichts anderes als ein `list`-Aufruf:
Jetzt brauchst Du aber gar keine Liste, sondern kannst genauso gut mit dem range-Objekt arbeiten:
Die innerste for-Schleife über j ist genauso überflüssig, weil Du da einfach mit slicing arbeiten kannst:
Jetzt ist eine Schleife über einen Index ein anti-Pattern, weil man über startline und endline auch direkt iterieren kann:
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?
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
Code: Alles auswählen
lines_to_read = []
for zetta in range(startline[i], endline[i]):
lines_to_read.append(zetta)
Code: Alles auswählen
lines_to_read = list(range(startline[i], endline[i]))
Code: Alles auswählen
lines_to_read = range(startline[i], endline[i])
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
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
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?