2014-02-12 14 views
10

Ich möchte sehr große Datei (4GBish) Chunk für Chunk lesen.Große Datei in Chunks lesen C#

Ich versuche derzeit eine StreamReader und die Read() lesen Methode zu verwenden. Die Syntax ist:

sr.Read(char[] buffer, int index, int count) 

Da der Index ein int ist, es wird Überlauf in meinem Fall. Was sollte ich stattdessen verwenden?

Antwort

7

Der Index der Startindex des Puffers ist nicht der Index des Dateizeigers, in der Regel würde es Null sein. Bei jedem Leseaufruf lesen Sie Zeichen, die dem Zählparameter Read entsprechen. Sie würden nicht alle Dateien auf einmal lesen, sondern in Chunks lesen und diesen Chunk verwenden.

Der Index des Puffers, an dem Schreiben beginnen, reference.

char[] c = null; 
while (sr.Peek() >= 0) 
{ 
    c = new char[1024]; 
    sr.Read(c, 0, c.Length); 
    //The output will look odd, because 
    //only five characters are read at a time. 
    Console.WriteLine(c); 
} 

Das oben gezeigte Beispiel bereit 1024 Bytes und schreiben zu trösten. Sie können diese Bytes verwenden, z. B. indem Sie diese Bytes über eine TCP Verbindung an eine andere Anwendung senden.

Wenn die Read-Methode verwendet wird, ist es effizienter, einen Puffer zu verwenden, dass die gleiche Größe wie der interne Puffer des Stroms ist, wo der internen Puffer auf die gewünschte Blockgröße festgelegt ist, und immer Lesen Sie weniger als die Blockgröße. Wenn die Größe des internen Puffers beim Erstellen des Streams nicht angegeben wurde, beträgt seine Standardgröße 4 Kilobyte (4096 Byte), MSDN.

+2

Dies. Sie [können nicht alle 4 GB in einem Byte-Array trotzdem haben] (http://stackoverflow.com/questions/2338778/what-is-the-maximum-length-of-a-array-in-net-on-- 64-Bit-Fenster). – CodeCaster

+0

Er würde in Stücke lesen und sie verwenden. – Adil

0

Sie könnten die einfachere Version von Read versuchen, die den Stream nicht aufteilt, sondern stattdessen Zeichen für Zeichen liest. Sie müssten das Chunking selbst implementieren, aber es würde Ihnen mehr Kontrolle geben, so dass Sie stattdessen ein Long verwenden können.

http://msdn.microsoft.com/en-us/library/ath1fht8(v=vs.110).aspx