Hallo BlackJack, hallo sma,
danke für die weiteren Beiträge, die kommen meinem Verständnis zugute. Bei der Gelegenheit habe ich noch 'ne vermeintlich kurze Frage zur Speicherauslastung:
Wie kann ich die aktuelle Speicherauslastung von Python aus sehen? Ich würde zur Kontrolle gerne nach dem Einlesen von langen Datenzeilen die aktuelle Speicherauslastung über die Konsole ausgeben.
Grüße, Tyrax
MemoryError: Suche eine gute Datenstruktur
Nach wie vor bin ich der Meinung, ich bekomme (problemlos) ein Array mit 32 Mio Einträge in den Hauptspeicher. Ich habe allerdings nicht probiert, was ein `map(int, arr)` anrichtet. Ich hätte vermutet, CPython ist schau genug, ein zweites Array mit 32 Mio Datensätzen anzulegen und nicht zu versuchen, dieses inkrementell zu vergrößern, was bei dem üblichen Algorithmus, die Größe immer zu verdoppelt, zu 64 Mio Einträgen a 8 Bytes führen könnte.
Ich kann's gerade nicht ausprobieren, da mein System schon jetzt im Swap ist und ich nicht 2 GB oder so über habe. Aber ich sagte ja, es wäre nicht weiter schwer, die Zeile nicht komplett sondern nur bis jeweils zum ";" bzw. Zeilende zu lesen:
Stefan
Ich kann's gerade nicht ausprobieren, da mein System schon jetzt im Swap ist und ich nicht 2 GB oder so über habe. Aber ich sagte ja, es wäre nicht weiter schwer, die Zeile nicht komplett sondern nur bis jeweils zum ";" bzw. Zeilende zu lesen:
Code: Alles auswählen
with open(name) as f:
c = f.read(1)
b = ""
i = 0
while True:
if c == '' or c == '\n' or c == ';':
nums[i] += int(b)
b = ""
if c == '\n':
i = 0
else:
i += 1
else:
b += c
if not c:
break
c = f.read(1)
@sma: Theoretisch müsste der Speicher ausreichen und theoretisch könnte man für jedes Byte einer >100 MiB grossen Datei auch einen `read()`-Aufruf absetzen. Praktisch ist beides nicht ernsthaft brauchbar.