Schreiben eines langen Arrays auf Festplatte

8

Ich muss riesige Arrays von Longs (bis zu 5 GB) auf die Festplatte schreiben. Ich habe versucht, BinaryFormatter zu verwenden, aber es scheint in der Lage zu sein, nur Arrays der Größe kleiner als 2GB zu schreiben:

%Vor%

Dieser Code löst IndexOutOfRangeException für größere Arrays aus.

Ich möchte Element pro Element nicht speichern, weil es zu viel Zeit braucht. Gibt es einen geeigneten Weg, um solch ein großes Array zu speichern?

Schreibelement pro Element:

%Vor%

Das ist sehr langsam.

    
Ari 13.08.2014, 21:10
quelle

2 Antworten

8

OK, vielleicht habe ich ein wenig mit dem MMF über Bord getragen. Hier ist eine einfachere Version mit nur einem Dateistream (ich denke, das hat Scott Chamberlain in den Kommentaren vorgeschlagen).

Timings (auf einem neuen System) für ein 3Gb-Array:

  1. MMF: ~ 50 Sekunden.
  2. FilStream: ~ 30 Sekunden.

Code:

%Vor%

Alte Lösung, MMF

Ich denke, Sie können es mit einer MemoryMappedFile versuchen. Ich habe ~ 2 bis ~ 2,5 Minuten für ein 3Gb-Array auf einem relativ langsameren externen Laufwerk.

Was diese Lösung beinhaltet:

  1. Erstellen Sie zuerst eine leere Datei.
  2. Erstellen Sie eine Speicherabbilddatei mit einer Standardkapazität von X Byte, wobei X die Array-Länge in Byte ist. Dadurch wird die physische Länge der Datei auf dem Datenträger automatisch auf diesen Wert festgelegt.
  3. Dump das Array auf die Datei über eine 32 k x 8 Bytes breite Accessor (Sie können dies ändern, es ist nur etwas, was ich getestet habe). Also schreibe ich das Array in 32k Elemente.

Beachten Sie, dass Sie den Fall berücksichtigen müssen, wenn die Array-Länge kein Vielfaches von chunkLength ist. Zu Testzwecken ist es in meinem Beispiel :).

Siehe unten:

%Vor%     
Marcel N. 13.08.2014, 22:11
quelle
0

Ich schlage vor, dass der obige Code falsch ist. Sollte es nicht

sein %Vor%

Dasselbe gilt für das Speicherabbildungsbeispiel

    
Richard Hartley 23.11.2016 11:49
quelle

Tags und Links