3 Stimmen

Zyklieren einer Binärdatei in Python - Entfernen am Anfang Hinzufügen am Ende

Könnte jemand mich auf eine Methode der Radfahren eine binäre Datei in Python zeigen? Ich habe eine Datei voll von 4-Byte-Ganzzahlen im Grunde und wenn die Datei eine bestimmte Größe erreicht, d.h. eine bestimmte Anzahl von Werten geschrieben wurden, möchte ich beginnen, entfernen Sie ein von Anfang und Hinzufügen eines am Ende.

Ich bin noch ziemlich neu in Python, so gerade versuchen, eine ordentliche Art und Weise, dies zu tun zu denken.

Gracias.

0 Stimmen

Wie viele sind "voll"? Eine Million? Eine Milliarde? Mehrere Milliarden?

1 Stimmen

Ich bin mir nicht sicher, ob das wichtig ist? Eine Zahl, die ich definiere, wenn sie diese erreicht, möchte ich sie zyklieren. 2000 oder so, warum ist das relevant?

0 Stimmen

Bis zu einer Milliarde können Sie alles im Speicher erledigen. Nach einer Milliarde braucht man etwas Gescheiteres. Die Zahl, die Sie definieren, spielt eine große Rolle. Für 2000 machen Sie das Ganze im Speicher und denken Sie nicht weiter darüber nach.

3voto

Björn Pollex Punkte 72424

Meine Idee: Die erste Ganzzahl in der Datei gibt die Position des tatsächlichen Beginns der Daten an. Am Anfang wird dies 4 sein (unter der Annahme, dass eine ganze Zahl 4 Bytes benötigt). Wenn die Datei voll ist, fängt man einfach an, die Daten am Anfang zu überschreiben und erhöht die Positions-Ganzzahl. Dies ist im Grunde ein einfaches Ringpuffer in Form einer Datei.

0 Stimmen

Dies würde gut funktionieren, aber es scheint, in Python können Sie nicht an den Anfang einer Datei schreiben, ohne die ganze Menge neu zu schreiben - d.h. suchen dann schreiben scheint nicht zu funktionieren?

0 Stimmen

Ich möchte auch nicht jedes Mal die gesamte Liste neu schreiben müssen, da sie sehr umfangreich ist!

0 Stimmen

@Adam Cobb: Das müssten Sie zu einer zusätzlichen Frage machen. Möglicherweise müssen Sie die Datei vor der Suche leeren oder etwas Ähnliches.

3voto

S.Lott Punkte 371691

2000 Zahlen?

Das sind 16K. Machen Sie es im Speicher. Indem Sie Ihre Puffer als 16K deklarieren, können Sie wahrscheinlich die gesamte Operation in einer einzigen E/A-Anforderung durchführen. Und auf einigen großen 64-Bit-Systemen sind 2000 Zahlen mehr oder weniger die Standardpuffergröße.

Ihr Datenvolumen ist mikroskopisch klein. Verschwenden Sie keine Zeit mit der Optimierung einer so winzigen Datenmenge.

with open( "my file.dat", "rb", 16384 ) as the_file:
    my_circular_queue = list( read_the_numbers( the_file ) )

if len(my_circular_queue) >=  2000:
    my_circular_queue = my_circular_queue[1:]
my_circular_queue.append( a_new_number )

with open( "my file.dat", "wb", 16384 ) as the_file:
    write_the_numbers( the_file, my_circular_queue )

Das passt total ins Gedächtnis. Verschwenden Sie keine Zeit mit der Suche nach einer komplexen Aktualisierung.

0 Stimmen

Vielen Dank für Ihre Antwort, aber ich habe mit Space_C0wb0y's Lösung gegangen, ich bin sicher, es wäre in Ordnung, dies im Speicher zu tun, aber diese Schreibvorgänge können ziemlich regelmäßig passieren, und ich möchte nicht die ganze Liste in den Speicher jedes Mal zu laden, um zurück zu schreiben (auch wenn es nur 2000 ist).

0 Stimmen

@Adam Cobb: 2000 Gleitkommazahlen belegen 16K Speicherplatz. Auf einigen Systemen sind die Standard-E/A-Puffer größer als dieser Wert. Das ist eine vernachlässigbare, mikroskopisch kleine Menge an Daten. Sie verschwenden Zeit mit dem Versuch, ein ausgeklügeltes E/A-Schema zu entwickeln, wenn die Datenmenge so mikroskopisch klein ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X