- Größere Datei-Streams mit C#
Gibt es einige text-Dateien(Datensätze) die ich brauche, um den Zugriff mit C#.Net. Aber die Frage ist, sind diese Dateien größer als 1GB. (Mindestgröße 1 GB)
was muss ich tun?
Was sind die Faktoren, die ich brauche zu konzentrieren?
Kann jemand mir eine Idee, herüber zu kommen aus dieser situation.
EDIT:
Danke für die schnellen Antworten. ja, Sie sind Datensätze mit fester Länge. Diese text-Dateien, die von einem lokalen Unternehmen. (Dort im letzten Monat, Aufzeichnungen von Transaktionen)
Ist es möglich, den Zugriff auf diese Dateien wie normale Textdateien (mit der normalen Datei-stream).
und
Wie etwa dem memory management??????
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erweiterung auf CasperOne Antwort
Einfach gesagt es gibt keine Möglichkeit, zuverlässig setzen eine 100GB-Datei in den Speicher zu einer Zeit. Auf einer 32-bit Maschine gibt es einfach nicht genug Adressierung Raum. In einer 64-bit-Computer gibt es genug-Adressierung Raum, aber während der Zeit, in der es nehmen würde, um tatsächlich Holen Sie sich die Datei im Speicher, die dem Benutzer wird getötet haben, die Ihren Prozess aus der frustration heraus.
Der trick ist, um die Datei zu verarbeiten inkrementell. Das Basis-System.IO.Stream () - Klasse ist ausgelegt für eine variable (und möglicherweise unendlichen) Strom in unterschiedlichen Mengen. Es hat mehrere Methoden Lesen, die nur die Fortschritte down-stream einer bestimmten Anzahl von bytes. Sie müssen diese Methoden verwenden, um die teilen sich den Strom.
Kann ich keine Informationen mehr geben, weil Ihr Szenario ist nicht spezifisch genug. Können Sie uns mehr details oder Ihre Aufzeichnung delimeters oder einige Beispiel-Zeilen aus der Datei?
Update
Wenn Sie Datensätze mit fester Länge, dann System.IO.- Stream funktioniert gut. Sie können sogar Datei.Open() auf, um Zugriff auf das zugrunde liegende Stream-Objekt. Stream.Lesen hat eine überladung, die Anforderungen die Anzahl der zu lesenden bytes aus der Datei. Da Sie Datensätze mit fester Länge sollte das gut funktionieren für Ihr Szenario.
Solange Sie nicht nennen ReadAllText() und verwenden Sie stattdessen die Stream.Read () - Methoden, die eine explizite byte-arrays, Speicher kein Problem sein. Der zugrunde liegende Stream-Klasse wird darauf achten, dass nicht die gesamte Datei in den Speicher (das ist natürlich, es sei denn Sie wünschen es 🙂 ).
Sind Sie nicht speziell auf die Auflistung der Probleme, die Sie überwinden müssen. Eine Datei können Sie 100GB und Sie haben keine Probleme, die Verarbeitung.
Wenn Sie haben, um die Datei zu verarbeiten als ganzes dann ist zu verlangen, dass einige creative coding, aber wenn Sie können einfach verarbeiten Teile der Datei gleichzeitig, dann ist es relativ leicht zu bewegen, um die Position in der Datei, die Sie brauchen, um zu starten aus, verarbeiten die Daten, die Sie verarbeiten müssen, in Blöcken, und schließen Sie die Datei.
Mehr information wäre hier sicherlich hilfreich.
Was sind die wichtigsten Probleme, die Sie derzeit? Die große Sache zu erinnern ist, zu denken, in Bezug auf die streams, d.h. halten Sie die minimale Menge von Daten im Speicher, die Sie können. LINQ eignet sich hervorragend zum arbeiten mit Sequenzen (obwohl es gibt einige die Pufferung von Operationen, die Sie vermeiden müssen, wie OrderBy).
Beispielsweise hier eine Art des Umgangs mit einfachen Aufzeichnungen aus einer großen Datei effizient (Hinweis: die iterator-block).
Für die Durchführung mehrerer Aggregate/Analyse über große Daten aus Dateien, betrachten Push-LINQ in MiscUtil.
Hinzufügen Sie können mehr Kontext, um die Probleme, die Sie denken?
Erweiterung auf JaredPar Antwort.
Wenn die Datei ist eine binäre Datei (also int-Werte gespeichert als 4-Byte-Zeichenfolgen fester Länge usw.) können Sie die BinaryReader-Klasse. Einfacher als ziehen aus n bytes, und dann versuchen, zu vernehmen, dass.
Beachten Sie auch, dass die read-Methode-System.IO.Stream ist eine non-blocking-Betrieb. Wenn Sie Fragen, für 100 bytes zurückgeben, die weniger als das, aber noch nicht erreicht haben, das Ende der Datei.
Den BinaryReader.ReadBytes-Methode blockiert, bis es liest " wird die angeforderte Anzahl von bytes oder Ende der Datei - was immer zuerst kommt.
Nette Zusammenarbeit Jungs 🙂
Hey Leute, ich weiß, dass dieser post berührt wurden noch nicht in eine Weile, aber ich wollte nur posten, eine Website, die hat 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