Frage

Es gibt einige Textdateien (Datensätze), die ich zugreifen müssen C # .NET. Aber die Sache ist die Dateien, die größer als 1 GB. (Mindestgröße beträgt 1 GB)

Was soll ich tun muss? Was sind die Faktoren, die ich sein müssen konzentrieren?

Kann jemand geben Sie mir eine Idee aus dieser Situation kommen, um über.

EDIT:

Vielen Dank für die schnellen Antworten. Ja, sie sind Satzlänge festgelegt. Diese Textdateien kommen von einem lokalen Unternehmen. (Es letzten Monat Transaktionsaufzeichnungen)

Ist es möglich, diese Dateien wie normale Textdateien (mit normaler Datei-Stream) zuzugreifen.

und

Wie über die Speicherverwaltung ????

War es hilfreich?

Lösung

Die Erweiterung auf casperOne Antwort

Einfach gesagt gibt es keine Möglichkeit zuverlässig auf einmal eine 100-GB-Datei in den Speicher zu setzen. Auf einer 32-Bit-Maschine ist es einfach nicht genug Platz Adressierung. In einer 64-Bit-Maschine Raum genug Adressierung ist aber während der Zeit, in der es tatsächlich dauern würde, um die Datei im Speicher zu erhalten, werden Ihre Benutzer Ihren Prozess aus Frust getötet haben.

Der Trick besteht darin, die Datei schrittweise zu verarbeiten. Die Basis System.IO.Stream () die Klasse ist entworfen, um eine Variable (und möglicherweise unendlichen) Strom in unterschiedlichen Mengen zu verarbeiten. Es hat mehr Read-Methoden, die nur einen Strom nach unten eine bestimmten Anzahl von Bytes voranschreiten. Sie müssen diese Methoden verwenden, um den Strom zu unterteilen.

Ich kann nicht mehr Informationen geben, weil Ihr Szenario nicht spezifisch genug ist. Können Sie uns mehr Details oder Ihren Eintrag Trennzeichen oder einige Beispielzeilen aus der Datei geben?

Aktualisieren

Wenn sie Satzlänge festgelegt sind, dann werden System.IO.Stream gut funktionieren. Sie können sogar verwenden File.Open () Zugriff auf das zugrunde liegende Stream-Objekt zu erhalten. Stream.Read hat eine Überladung, die die Anzahl der Bytes anfordert, um aus der Datei gelesen werden. Da sie Satzlänge festgelegt werden, sollten diese für Ihr Szenario gut funktionieren.

Solange Sie nicht nennen ReadAllText () und stattdessen die Stream.Read () Methoden verwendet werden, den expliziten Byte-Arrays nehmen, Speicher wird kein Problem sein. Die zugrunde liegende Stream-Klasse wird darauf achten, nicht die gesamte Datei in den Speicher zu stellen (das ist natürlich, wenn Sie es fragen :)).

Andere Tipps

Sie sind die Auflistung nicht speziell auf die Probleme, die Sie überwinden müssen. Eine Datei kann 100 GB und man kann keine Probleme haben, es zu verarbeiten.

Wenn Sie die Datei zu verarbeiten haben als Ganze dann, dass wird einige kreative Codierung erfordern, aber wenn man einfach Prozessabschnitte der Datei zu einem Zeitpunkt, dann ist es relativ einfach zu bewegen, um die Position in der Datei, die Sie aus, starten müssen Sie die Daten in Blöcken verarbeiten müssen, und schließen Sie die Datei.

Weitere Informationen hier wäre sicherlich hilfreich sein.

Was sind die wichtigsten Probleme, die Sie im Moment haben? Die große Sache zu erinnern ist, in Bezug auf die Ströme denken - das heißt die minimale Menge an Daten im Speicher zu halten, was Sie können. LINQ ist ausgezeichnet an mit Sequenzen arbeiten (obwohl es einige Pufferoperationen müssen Sie vermeiden, wie SortiertNach).

Zum Beispiel hier so einfach zu handhaben Datensätze aus einer großen Datei effizient (die Iteratorblock beachten).

Für mehrere Aggregate / Analyse über große Daten aus Dateien durchführen, sollten Sie Drücken Sie LINQ in MiscUtil .

Können Sie mehr Kontext zu den Problemen hinzufügen Sie denken an?

Die Erweiterung auf JaredPar Antwort.

Wenn die Datei eine Binärdatei (d ints gespeichert als 4 Bytes, feste Länge Strings usw.) ist, dass Sie die Binary Klasse verwenden können. Einfacher als das Herausziehen n Bytes und dann zu versuchen, das zu befragen.

Beachten Sie auch die Lesemethode auf System.IO.Stream ein nicht blockierende Betrieb ist. Wenn Sie für 100 Bytes fragen kann es zurückgeben weniger als das, aber noch nicht das Ende der Datei erreicht ist.

Die BinaryReader.ReadBytes Methode blockiert, bis sie die gewünschte Anzahl von Bytes oder Ende der Datei liest -., Die immer an erster Stelle steht

Nizza Zusammenarbeit Jungs:)

Hallo Leute, Ich weiß, dass dieser Beitrag nicht in einer Weile berührt hat, aber ich wollte nur eine Website veröffentlichen, die die Lösung für Ihr Problem.

http: //thedeveloperpage.wordpress.com/c-articles/using-file-streams-to-write-any-size-file-introduction/

Hoffe, es hilft!

-CJ

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top