Autor Beitrag
joha
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Mo 09.09.13 19:28 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19273
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
msdn.microsoft.com/e...ibrary/dd997372.aspx
joha Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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.


ausblenden 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