2009-05-14 7 views
3

Art des Gegenteils von this question.Python: Datei-IO - Inkrementelle Spülung deaktivieren

Gibt es eine Möglichkeit, Python zu sagen "Schreib nicht auf die Festplatte, bis ich es dir sage." (durch Schließen oder Leeren der Datei)? Ich schreibe in eine Datei im Netzwerk und schreibe lieber die gesamte Datei auf einmal.

In der Zwischenzeit schreibe ich in einen StringIO-Puffer und schreibe das dann auf die Festplatte am Ende.

+0

Warum? Welchen Wert haben Sie, wenn Sie darauf warten, I/O-gebunden zu werden, wenn Sie mit der Datenverarbeitung fertig sind? –

+0

Der Server ist so konfiguriert, dass er den Datei-Cache vor dem Schließen festschreibt und alles verlangsamt. Während dies einen Datenverlust verhindert, ist die Datei, die ich schreibe, nutzlos, wenn sie nicht vollständig ist. Das Schreiben der Datei auf einen Datenträger hat sich als viel schneller erwiesen. –

Antwort

3

Nein, ein Blick auf das Python-Handbuch zeigt keine Option an, die Puffergröße auf unendlich einzustellen.

Ihre aktuelle Lösung ist im Grunde das gleiche Konzept.

Sie konnte Gebrauch Alex Idee, aber ich würde aus folgenden Gründen dagegen Gefahr:

  1. Die Puffergröße auf offen ist begrenzt auf 2^31-1 oder 2 Gigs. Jede größere wird in Folge „OverflowError: long int zu groß, um zu int zu konvertieren“
  2. Es ist nicht zu funktionieren scheint:

    a = open("blah.txt", "w", 2 ** 31 - 1) 
    for i in xrange(10000): 
        a.write("a") 
    

Öffnen Sie die Datei, ohne Python zu schließen, und Sie werden Siehe den Text

3

Sie können Ihre Datei mit einem so großen Puffer öffnen, wie Sie möchten. Zum Beispiel, um bis zu einer Milliarde Bytes für die Pufferung zu verwenden, x=open('/tmp/za', 'w', 1000*1000*1000) - wenn Sie hundert Milliarden Bytes Speicher haben und sie alle verwenden möchten, fügen Sie einfach ein anderes * 100 ... hinzu ;-). Speicher wird nur in der tatsächlich benötigten Menge verbraucht, also, keine Sorge ...

1

Ich würde sagen, das hängt teilweise davon ab, was Sie versuchen zu tun.

Der Fall, in dem ich auf dieses Problem stieß war, wenn meine Anwendung war ein wenig langsam Erstellen einer Datei, die von einer anderen Anwendung verwendet wurde, würde die andere Anwendung unvollständige Versionen der Datei erhalten.

Ich löste es, indem ich die Datei an einen anderen Ort schrieb und sie dann in den korrekten Platz umbenannte, sobald ich fertig war.

Wenn Sie dies aus anderen Gründen wollen, dann hilft das vielleicht nicht.

+0

Dies ist es wert, getestet zu werden. Wenn Sie die Datei lokal schreiben und das Betriebssystem zum Kopieren in das Netzwerk verwenden, ist dies möglicherweise schneller. Vielen Dank –