2017-02-18 4 views
-3

Effizientes Schreiben und Lesen von gemischten Datentypen (nämlich unsigned integer, double, uint64_t, string) in einer Datei in C++.Effizientes Lesen und Schreiben gemischter Datentypen in C++ - 11

Ich muss schreiben und lesen Sie eine Daten mit gemischten Datentypen auf der Festplatte. Ich habe die folgende Methode zum Schreiben von Daten verwendet. Es erweist sich jedoch als sehr langsam.

Diese Methode erweist sich jedoch für große Datenmengen von 20 GB als sehr ineffizient. Kann mir bitte jemand vorschlagen, wie ich schnell gemischte Datentypen in C++

+2

Wenn Sie 20 Gigabytes Daten analysieren möchten, sollten Sie wahrscheinlich einige Nachforschungen darüber anstellen, wie Sie diese Aufgabe effizient erledigen können, ausgehend von den Grundlagen.Haben Sie einen Kollegen, der Ihnen vielleicht helfen kann? –

+0

@LightnessRacesinOrbit Leider keine –

+1

Dann, und verzeihen Sie mir dafür, es scheint, dass Sie und Ihr Team für diese Aufgabe nicht geeignet sind. Wie bist du damit fertig geworden? –

Antwort

1

lesen und schreiben kann. Ich denke, das erste, was Sie feststellen müssen, ist, ob Ihr Programm tatsächlich langsam ist.

Was meine ich damit? Natürlich denken Sie, dass es langsam ist, aber ist es langsam, weil Ihr spezielles Programm ineffizient ist, oder ist es langsam, weil das Schreiben von 20 Gigabyte Daten auf die Festplatte eine inhärent zeitraubende Operation ist?

Also das erste, was ich tun würde, ist einige Benchmark-Tests auf Ihrer Festplatte zu laufen, um seine rohe Geschwindigkeit (in Megabyte pro Sekunde oder was auch immer) zu bestimmen. Es gibt kommerzielle Apps, die dies tun, oder Sie könnten einfach ein eingebautes Dienstprogramm (wie dd auf Unix oder Mac) verwenden, um Ihnen eine ungefähre Vorstellung davon zu geben, wie lange Ihre spezielle Festplatte benötigt, um 20 Gigabyte Dummy-Daten zu lesen oder zu schreiben :

dd if=/dev/zero of=junk.bin bs=1024 count=20971520 

dd if=junk.bin of=/dev/zero bs=1024 

Wenn dd (oder was auch immer) in der Lage ist, die Daten wesentlich schneller als Ihr Programm kann übertragen werden, dann gibt es Raum für Ihr Programm zu verbessern. Auf der anderen Seite, wenn dd Geschwindigkeit ist nicht viel schneller als die Geschwindigkeit Ihres Programms, dann gibt es nichts, was Sie tun können, außer gehen und kaufen eine schnellere Festplatte (oder vielleicht eine SSD oder ein RAM-Laufwerk oder etwas).

Angenommen, der obige Test zeigt an, dass Ihr Programm weniger effizient ist als es sein könnte, würde ich zuerst versuchen, Ihre C++ iostream-Aufrufe durch eine äquivalente Implementierung zu ersetzen, die die C fopen()/fread()/fwrite()/fclose() API-Aufrufe verwendet. Einige C++ iostream-Implementierungen sind known to be somewhat inefficient, aber es ist unwahrscheinlich, dass die (einfacheren) C-I/O-APIs ineffizient sind. Wenn nichts anderes, vergleichen Sie die Leistung der C++ - und C-Versionen können Sie entweder bestätigen oder verweigern, dass Ihre C++ - Bibliothek Iostreams Implementierung ist ein Engpass.

Wenn nicht einmal die C-API Ihnen die Geschwindigkeit bringt, die Sie benötigen, ist die nächste Sache, die ich betrachten würde, Ihr Dateiformat in etwas zu ändern, das einfacher zu lesen oder zu schreiben ist; Angenommen, Sie verfügen über ausreichend Speicher, können Sie beispielsweise mmap() verwenden, um einen großen Block virtuellen Adressraums mit dem Inhalt einer Datei zu verknüpfen und dann den Dateiinhalt so zu lesen/schreiben, als wäre es RAM. (Je nachdem, wie Sie auf die Daten zugreifen, kann dies die Geschwindigkeit erhöhen oder verringern.)

Wenn alles andere fehlschlägt, ist die letzte Sache zu tun, die Menge der Daten zu reduzieren, die Sie lesen oder schreiben müssen. Gibt es Teile der Daten, die Sie getrennt speichern können, damit Sie sie nicht jedes Mal lesen und schreiben müssen? Gibt es dort Daten, die Sie kompakter speichern können (z. B. gibt es in Ihren Daten möglicherweise häufig verwendete Zeichenfolgen, die Sie anstelle von Zeichenfolgen als Integer-Codes speichern könnten)? Was, wenn Sie zlib verwenden, um die Daten zu komprimieren, bevor Sie sie schreiben, so dass weniger Daten geschrieben werden müssen? Die Daten, die Sie in Ihrem Beispiel zu schreiben scheinen, scheinen der Komprimierung zugänglich zu sein, wodurch Ihre 20-GB-Datei möglicherweise auf eine 5-GB-Datei reduziert wird. Etc.