Leistung beim Kopieren einer Datei mit fread / fwrite auf USB

8

Ich bin vor einem Stück Code, der eine Datei auf ein USB-Gerät kopiert. Der folgende Teil ist der wichtigste:

%Vor%

Das Ding, sagte der Kunde, ist es ziemlich langsam im Vergleich zu normalen PC & lt; - & gt; USB-Geschwindigkeit. Ich habe das nicht programmiert, also ist es meine Aufgabe, zu optimieren.

Also habe ich mich gefragt, ob es ein besserer Ansatz ist, zuerst die komplette Datei zu lesen und dann die Datei in einem Schritt zu schreiben. Aber ich weiß nicht, wie fehleranfällig das wäre. Der Code prüft auch nach jedem Kopiervorgang, ob alle Bytes richtig geschrieben wurden, so dass auch der Prozess verlangsamt werden kann.

Ich bin nicht das C ++ & amp; Hardware-Guru, also frage ich euch, wie ich die Dinge beschleunigen und das Kopieren erfolgreich machen konnte.

    
Johannes Klauß 16.01.2012, 11:24
quelle

3 Antworten

3
  1. Versuchen Sie, in großen Blöcken zu lesen / zu schreiben . 16M, 32M sind nicht schlecht zum Kopieren von Dateien.
  2. Wenn Sie nur die Datei kopieren möchten, können Sie immer system() aufrufen. Dies ist schneller.
  3.   

    Der Code überprüft auch nach jedem Kopiervorgang, ob alle Bytes richtig geschrieben wurden, so dass der Prozess möglicherweise auch verlangsamt wird.

    Sie können es überprüfen, indem Sie Hash für einen größeren Block erstellen. Wie die Datei in 64M Chunks aufteilen. Dann passe die Hashes dieser Chunks an. Bittorrent-Protokoll verfügt über diese Funktion.

  4. Wenn Sie mmap oder MapViewOfFile verfügbar haben, ordnen Sie die Datei zuerst zu zu. Dann schreibe es auf USB. Auf diese Weise wird die Leseoperation vom Kernel gehandhabt.

  5. Kerrek hat gerade die Verwendung von memcpy auf mmap kommentiert. memcpy mit 2 mmap ed-Datei scheint großartig.

Beachten Sie auch, dass die meisten aktuellen Betriebssysteme auf den USB-Stick schreiben, wenn sie entfernt werden. Vor dem Entfernen schreibt es einfach die Daten in einen Cache. So kann die Kopie von OS schneller erscheinen.

    
Shiplu Mokaddim 16.01.2012, 11:48
quelle
1

Was ist mit überlappenden Lese- und Schreibvorgängen?

Im aktuellen Code ist die Gesamtzeit time(read original) + time(write copy) , wenn Sie den ersten Block lesen, während Sie mit dem Lesen des zweiten Blocks usw. beginnen, wäre Ihre Gesamtzeit max(time(read original), time(write copy)) (plus die Zeit Lesen / Schreiben) der erste und der letzte Block, die nicht in Pipelines verschoben werden.)

Es könnte fast die Hälfte der Zeit sein, wenn das Lesen und Schreiben mehr oder weniger gleichzeitig dauert.

Sie können dies mit zwei Threads oder mit asynchronem IO tun. Leider sind Threads und async IO plattformabhängig. Sie müssen daher Ihr Systemhandbuch überprüfen oder geeignete portable Bibliotheken auswählen.

    
fortran 16.01.2012 11:33
quelle
0

Ich würde einfach mit einigen OS-spezifischen Funktionen gehen, die das sicher schneller machen, als alles, was nur mit c / c ++ geschrieben wurde.

Für Linux könnte dies die Funktion sendfile sein. Für Windows CopyFile wird die Aufgabe erledigen.

    
Zuljin 16.01.2012 14:48
quelle

Tags und Links