Entwickler-Ecke

IO, XML und Registry - Ca. 120 GB Datei blockweise einlesen und schreiben


joha - Mo 09.09.13 19:28
Titel: Ca. 120 GB Datei blockweise einlesen und schreiben
Hallo,

ich bin neu hier und C#-Anfänger.

Ich möchte eine existierende Datei blockweise (Blockgrösse: 1024*1024) einlesen. Die Dateigrösse liegt etwa bei 120 GB. Jeder Block soll nach einer folgenden Bearbeitung wieder an der entsprechenden Position zurück geschrieben werden. Der gelesene Block soll als byte-Array verarbeitet werden.

Bei der Einlesung geht es um Schnelligkeit. Mit welchem Reader ist das am besten umzusetzen? Ein Beispiel wäre nett.

Google war dazu nicht sehr ergiebig. Ich freue mich über jeden hilfreichen Vorschlag.

joha


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mo 09.09.2013 um 19:34


jaenicke - Mo 09.09.13 21:28

Hallo und :welcome:

Am sinnvollsten ist dabei eine Zugriff über MMFs. Dabei spiegelt Windows die Datei blockweise im Arbeitsspeicher, wobei diese Operationen automatisch optimiert werden. Deshalb ist das extrem schnell.

In C# habe ich damit noch nicht gearbeitet, aber in der Doku findest du auch ein Beispiel:
http://msdn.microsoft.com/en-us/library/dd997372.aspx


joha - Di 10.09.13 00:21

Vielen Dank! MMF ist mir unbekannt gewesen. Ich habe mal einen theoretischen Ansatz konstruiert. Jetzt habe ich nur noch das Problem, den Buffer, nach seiner notwendigen Bearbeitung, wieder zurück in die Datei zu schreiben. An dieser Stelle wäre Hilfe immer hoch willkommen.



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
    private bool readBlockFromFile(SecureString fileName, ref byte[] b, long pos)
    {
      IntPtr p = System.Runtime.InteropServices.Marshal.SecureStringToBSTR(fileName);

      try
      {
         using (System.IO.MemoryMappedFiles.MemoryMappedFile objMF = 
             System.IO.MemoryMappedFiles.MemoryMappedFile.CreateFromFile(
           System.Runtime.InteropServices.Marshal.PtrToStringUni(p),
             System.IO.FileMode.Open, "NewTextFile" ))
       
             using (System.IO.MemoryMappedFiles.MemoryMappedViewAccessor accessor = 
                 objMF.CreateViewAccessor(100100))
             {  
                 accessor.ReadArray(pos, b, 0, b.Length);
             }
       
        return true;
      }
      catch {MessageBox.Show("Fehler");return false;}
      finally  {Marshal.ZeroFreeBSTR(p);}  
    }


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt