Laden...

Fehlermeldung "Im Puffer ist nicht genügend Speicherplatz vorhanden"

Erstellt von key-board vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.164 Views
K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren
Fehlermeldung "Im Puffer ist nicht genügend Speicherplatz vorhanden"

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?

16.830 Beiträge seit 2008
vor 10 Jahren

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.

5.658 Beiträge seit 2006
vor 10 Jahren

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

K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

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

W
872 Beiträge seit 2005
vor 10 Jahren

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.

K
key-board Themenstarter:in
33 Beiträge seit 2013
vor 10 Jahren

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

16.830 Beiträge seit 2008
vor 10 Jahren

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.