std::ifstream Puffer-caching

In meiner Anwendung, die ich bin versucht zu verschmelzen sortiert Dateien (halten Sie sortiert natürlich), also habe ich Durchlaufen jedes element in beiden Dateien zu schreiben, die minimal die Dritte. Das funktioniert ziemlich langsam bei großen Dateien, so weit ich sehe keine andere Wahl (die iteration gemacht werden muss), die ich versuche zu optimieren-Datei laden. Ich kann eine Menge an RAM, die ich benutzen kann für die Pufferung. Ich meine zu Lesen, anstatt 4 bytes aus den beiden Dateien jedes mal, wenn ich Lesen kann, sobald etwas wie 100Mb und die Arbeit mit, dass die Puffer nach, bis es kein element in den Puffer, dann habe ich werde füllen Sie den Puffer wieder. Aber ich denke, ifstream ist bereits das tun, wird es mir mehr Leistung und gibt es einen Grund? Wenn fstream sind macht, vielleicht kann ich ändern Größe der Puffer?

Hinzugefügt

Mein Aktueller code sieht so aus (pseudocode)

//this is done in loop
int i1 = input1.read_integer();
int i2 = input2.read_integer();
if (!input1.eof() && !input2.eof())
{
   if (i1 < i2)
   {
      output.write(i1);
      input2.seek_back(sizeof(int));
   } else
      input1.seek_back(sizeof(int));
      output.write(i2);
   }
} else {
   if (input1.eof())
      output.write(i2);
   else if (input2.eof())
      output.write(i1);
}

Was ich nicht mag, ist hier

  • seek_back - ich habe, zu suchen zurück zur vorherigen position, da es keine Möglichkeit gibt, peek 4 bytes
  • zu viel beim Lesen der Datei
  • wenn einer der Ströme in EOF-es geht immer noch weiter, um zu überprüfen, dass der Strom, anstatt Inhalte von anderen Strom direkt zum Ausgang, aber das ist kein großes Problem, da die chunk-Größen sind fast immer gleich.

Können Sie vorschlagen, eine Verbesserung für das?

Dank.

  • Wie Plattform-spezifische willst du? Verschiedene Plattformen können Sie Hinweise zu den OS-Kernel, um es zu bekommen um den job zu erledigen schneller-aber natürlich auch diejenigen, die gehen, um Plattform-spezifische.
  • Ich möchte nicht, um alle Plattform-spezifischen code gibt. Ist es vernünftig zu implementieren Pufferung?
  • Dann mein Vorschlag ist, zu versuchen, das caching selbst und sehen Sie, ob es einen Unterschied macht. Ohne auf die kernel-obwohl es natürlich nicht so schnell wie möglich. (Zum Beispiel, unter Windows würde man pass FILE_FLAG_SEQUENTIAL_SCAN für eine workload so)
  • Unter Windows würde man auch verwenden MapViewOfFile. Auf *nix fadvise und mmap.
  • Da ist ein Fehler in deinem code. (Was ist, wenn beide Ströme erreichen EOF zur gleichen Zeit?)
  • Dann nichts geschrieben wird ausgegeben und es wird der loop verlassen.
  • Hinzugefügt Pufferung und entfernt suchen Algorithmus, derzeit funktioniert viel besser. Vielen Dank an alle.
  • Sie können beide erreichen ein EOF-Zeichen an der gleichen Zeit. Als er nicht eine seek_back auf einem Datenstrom jedes mal.

InformationsquelleAutor ledokol | 2010-12-29
Schreibe einen Kommentar