Wie man gigantische Dateien effizient mit C # zusammenführt

7

Ich habe über 125 TSV-Dateien von ~ 100MB, die ich zusammenführen möchte. Der Zusammenführungsvorgang darf die 125 Dateien zerstören, nicht jedoch die Daten. Was zählt ist, dass am Ende, ich eine große Datei mit dem Inhalt aller Dateien nacheinander (keine bestimmte Reihenfolge).

Gibt es einen effizienten Weg, das zu tun? Ich frage mich, ob Windows eine API zur Verfügung stellt, um einfach eine große "Union" all dieser Dateien zu erstellen? Ansonsten muss ich alle Dateien lesen und einen großen schreiben.

Danke!

    
Martin 24.08.2010, 13:14
quelle

4 Antworten

17

Also "Mischen" ist wirklich nur die Dateien nacheinander schreiben? Das ist ziemlich einfach - Öffnen Sie einfach einen Ausgabestream und öffnen Sie dann wiederholt einen Eingabestream, kopieren Sie die Daten und schließen Sie. Zum Beispiel:

%Vor%

Das verwendet die Methode Stream.CopyTo , die in .NET 4 neu ist. Wenn Sie .NET 4 nicht verwenden, wäre eine andere Hilfsmethode nützlich:

%Vor%

Es gibt nichts, von dem ich weiß, dass es effizienter ist als das ... aber wichtig ist, dass es auf Ihrem System überhaupt nicht viel Speicher braucht. Es ist nicht so, als würde die ganze Datei wiederholt in den Speicher gelesen und dann wieder neu geschrieben.

BEARBEITEN: Wie in den Kommentaren erwähnt, gibt es Möglichkeiten, wie Sie mit Dateioptionen umgehen können, um potenziell etwas effizienter zu machen, was das Dateisystem mit den Daten macht. Aber im Grunde wirst du die Daten lesen und schreiben, einen Puffer auf einmal, so oder so.

    
Jon Skeet 24.08.2010, 13:17
quelle
2

Mach es von der Kommandozeile:

%Vor%

oder

%Vor%     
Gabriel Magana 24.08.2010 13:18
quelle
2

Meinst du mit merge , dass du mit einer benutzerdefinierten Logik entscheiden willst, welche Zeilen wohin gehen? Oder meinst du, dass du die Dateien hauptsächlich zu einer großen verketten willst?

Im letzteren Fall ist es möglich, dass Sie dies gar nicht programmatisch machen müssen, sondern nur eine Batch-Datei mit diesem erzeugen ( /b ist für binär, entferne wenn nicht benötigt):

%Vor%

Mit C # würde ich den folgenden Ansatz verfolgen. Schreibe eine einfache Funktion, die zwei Streams kopiert:

%Vor%     
Abel 24.08.2010 13:19
quelle
0

Warum willst du das machen?

Eine Möglichkeit wäre es, mit der Fragmentierung auf niedriger Ebene herumzutüfteln, wäre cool, wenn Sie es zum Laufen bringen würden.

Hier ist ein Wrapper für C #.

Ссылка

    
Marcus Johansson 24.08.2010 13:18
quelle

Tags und Links