Hi Leute
Ich bekomme beim Erzeugen eines MMF's die oben genannte Fehlermeldung.
In das MMF soll ein Array von float zahlen geschrieben werden. Selbst wenn das Array eine länge von 1 besitzt kommt diese Fehlermeldung... Im RAM ist noch über 2GB frei.
public class mmf_erzeugen_work
{
public void mmf_file_work_erzeugen()
{
int filesize_work = 1; //größe des im RAM Reservierten Speicherplatzes
float[] mmf_file_work = new float[filesize_work]; //Array, welches in den RAM gespeichert werden soll
mmf_file_work[0] = 1; //Speicherstelle 0 des Array. Als status genutzt. Wenn 0 wird das MMF geschlossen.
using (var mmf = MemoryMappedFile.CreateNew("mmf_file_work", filesize_work)) //Neues MMF File erzeugen mit dem Namen "mmf_file" und der Größe filesize
{
// Lock: Das mmf_file für andere Prpgramme grundsätzlich Zugänglich machen und anzeigen, dass datei bereits verwendet wird.
bool mutexCreated;
Mutex mutex = new Mutex(true, "MMF_IPC_work", out mutexCreated);
// Create accessor to MMF: Zeiger auf mmf_file
using (var accessor = mmf.CreateViewAccessor(0, mmf_file_work.Length))
{
// Write to MMF; schreibe mmf_file in den Arbeitsspeicher
accessor.WriteArray<float>(0, mmf_file_work, 0, mmf_file_work.Length); <<<<<Hier tritt der Fehler auf
}
mutex.ReleaseMutex(); //mmf_file für andere Programme zur Benutzung freigeben
//solange mmf_file[0]>0 mmf verfügbar. wird ca alle 500 ms aktialisiert
while (mmf_file_work[0] != 0)
{
using (var mmflesen = MemoryMappedFile.OpenExisting("mmf_file_work"))
{
using (var accessor = mmflesen.CreateViewAccessor(0, mmf_file_work.Length))
{
Mutex mutexlesen = Mutex.OpenExisting("MMF_IPC_work");
mutex.WaitOne();
// Read from MMF
accessor.ReadArray<float>(0, mmf_file_work, 0, mmf_file_work.Length);
mutexlesen.ReleaseMutex();
}
}
Thread.Sleep(500); //warte 500 ms
}
}
Kann mir da jemand helfen?
Du wirst irgendeine Heap-Größe überschreiben. Der RAM hat nichts zu bedeuten. Es kann zB kein Objekt größer sein als 2GB.
Ab .NET 4.5 ist mit gcAllowVeryLargeObjects eine Erhöhung möglich.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo key-board,
da du in die Datei schreibst (und nicht in das Array) liegt es wohl an der Größe der Datei (und nicht des Arrays). Das geht auch aus der Beschreibung der Exceptions der WriteArray<T>-Methode in der Doku hervor:
ArgumentOutOfRangeException
position ist kleiner als 0 (null) oder größer als die Kapazität des Accessors.
- oder -
offset oder count ist kleiner als 0.
Du erstellst eine Datei mit der Größe von einem Byte und willst ein float mit 4 Byte dort hineinschreiben. Das kann nicht funktionieren.
Christian
Weeks of programming can save you hours of planning
ahh stimmt daran hab ich nicht gedacht dass eine float einheit 4 byte groß ist...
gibt es ne Möglichkeit diese reservierten Einheiten auf 4 byte zu vergrößern??
damit ich da int oder eben float zahlen hineinschreiben kann?
oder ich muss mir was ausdenken dess mit byte zahlen zu kodieren...
Das Programm ist der zentrale teil meiner Studienarbeit und ich bin so gut wie fertig damit... es fehlt halt nurnoch diese möglichkeit float ins mmf zu schreiben...
using (var accessor = mmf.CreateViewAccessor(0, mmf_file_work.Length*sizeof(float)))
wird wohl die noetige Anpassung sein...dann kannst Du auch auf Generics umstellen, um alle anderen nativen Typen abzubilden.
Perfekt Vielen Vielen Dank!!!
Studienarbeit ist gerettet.
es scheint als würde das Lesen und Schreiben von Float zahlen Funktionieren. Werds später ausgiebig testen
Studienarbeit ist gerettet.
Denk dran Foren als Informationsquellen namentlich zu nennen; ansonsten _kann _ (nicht muss) Dein Prüfer Punkte abziehen, wenn er diesen Thread findet und mit Deinem Code vergleicht.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code