Hallo, also ich habe es geschafft ein Boolean[,] - (2 dimensionales) Array mit Hilfe eines FileStreams und des BinaryFormatters zu serialisieren. Nun hat aber mein Boolean Array [3600, 1800] Elemente und das serialisieren dauert immer so ca. 10 Sekunden. (was ziemlich viel ist, wie ich finde......). Wie kann man das Beschleunigen, ich mache sowas:
FileStream str = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
BinaryFormatter formatter = new BinaryFormatter();
try
{
formatter.Serialize(str, this.allPositions);
}
catch (SerializationException)
{
}
finally
{
str.Close();
}
Alles anzeigen
Wobei "this.allPositions" eben das Boolean-Array ist.
Noch eine Frage, die eher Threading betrifft, aber mit dem serialisieren des Arrays zusammenhängt.
Ich habe ein Programm geschrieben, in dem mehrere Threads (zZ 32) immer wieder Daten von einer Webseite abfragen. Sind sie mit einem "Gebiet" fertig, dann wird sowas gemacht:
Dies steht im der, von Thread.Start() aufgerufenen Methode. GrabberFinished ist ein Eventhandler, der nur bei bestimmten Fällen gesetzt ist (daher != null), dann wird das GrabberFinished-Event geworfen, in dem dem aktuellen Thread ein neuer Bereich zugeordnet wird und jetzt wirds spannend: das SaveResults-Event wird geworfen, um die neuen Daten zu speichern (wobei dann eben auch der erste Code-Block aufgerufen wird). Im SaveResults-Eventhandler hab ich dann sowas:
if (this.dataGrid.InvokeRequired)
{
IntParamDelegate myDel = new IntParamDelegate(SaveResultsToFile);
this.dataGrid.Invoke(myDel, indexDone);
}
else
{
Console.WriteLine("Position " + indexDone + " set to true");
///set the Positions bool-value
lock (this)
{
this.myPositions.positionDone(indexDone);
this.myPositions.WritePositionsToFile();
this.myStreets.WriteStreetsToFile();
Console.WriteLine("Files saved");
}
}
Alles anzeigen
Also einfach ein Invoke (wenn notwendig) und sonst eine Textausgabe und dann ein lock mit dem Speicher-Code.
Und um diesen Lock geht es mir: Da ja 32 Threads gerade mit ihrem Bereich fertig sein können kann dieser Code ja auch 32 mal gleichzeitig aufgerufen werden, auch die "WriteXXXXToFile()-Funktionen - daher der globale Lock.... wie kann man sowas besser machen?? (oder sollte ich einfach einen Counter (zB) einbauen und immer nur nach dem 10. fertigen Bereich einmal schreiben?
Wie geht sowas elegant?
Und nochmal zur 1.Frage? Wenn das nicht schneller geht mit der Serialisierung: Sollte ich dann eventuell in Betracht ziehen die BOOLEANs als Bild abzuspeichern? Denn ich bin mir sicher, dass ein Bild recht schnell geladen/gespeichert werden kann, auch in dieser "Auflösung"..... mit OpenGL-Texturen wär das sicher machbar.....
Lg
Spite