Hi, ich brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im Speicher bleibt. Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen? Gruß Peter
Peter schrieb: > Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen? bist du sicher das er sich überhaupt darum kümmert?
Naja, du musst nur das Programm forken. Solang du das geforkte Programm offen hälst, sollte dein file im RAM bleiben.
Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff. Gruß Thomas
bubu schrieb: > Naja, du musst nur das Programm forken. Solang du das geforkte Programm > offen hälst, sollte dein file im RAM bleiben. was hat forken mit einem MemoryMappedFiles zu tun? Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht mehr ansprechen. Ich versteht das Problem nicht.
Peter schrieb: > ch brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im > Speicher bleibt. Definiere "die ganze Zeit". Laufzeit des Programms? Laufzeit mehrerer Instanzen des Programms. Laufzeit mehrerer unterschiedlicher Programme, die auf dieses MMF zugreifen. Allgemein: Solange ein Programm ein Handle auf dieses MMF hält wird das MMF wohl nicht weggeworfen. Ich denke auch (weiss es aber nicht) daß die Verwaltung von MMFs vom Betriebssystem und nicht vom GC von C# gemacht wird.
>bist du sicher das er sich überhaupt darum kümmert? Nein, bin ich nicht :) ABER >Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die >genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff. In den Beispielen wird das mit
1 | void OpenMMF() |
2 | {
|
3 | using
|
4 | {
|
5 | //Hier sind die MMF's sicher
|
6 | ...
|
7 | }
|
8 | }
|
gemacht. Aber wie soll das gehen? Sobald ich die Funktion verlasse hört auch mein 'using'-Bereich auf? >Naja, du musst nur das Programm forken. Solang du das geforkte Programm >offen hälst, sollte dein file im RAM bleiben. Was heisst 'forken'? >Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom >GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht >mehr ansprechen. Ich versteht das Problem nicht
1 | class Test |
2 | {
|
3 | MemoryMappedFile m_mmf; |
4 | |
5 | Test() |
6 | {
|
7 | m_mmf = MemoryMappedFile.Create("testmap"); |
8 | }
|
9 | }
|
Das heisst also, wenn ich das so mache, dann wird mir da nichts 'wegoptimiert'? Mein m_mmf ist durchweg gültig? Aber warum wird dann immer mit 'using' gearbeitet? Gruß Peter
Peter schrieb: > Sobald ich die Funktion verlasse hört > auch mein 'using'-Bereich auf? hast du dir überhaupt mal durchgelesen wofür using da ist? http://msdn.microsoft.com/de-de/library/yh598w02%28v=vs.80%29.aspx Damit kann man sicherstellen das danach wieder aufgefäumt wird. Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist doch gut. Das ganze hat wenig mit dem GC oder mit dem optimerer zu tun. Es ist nur ein hilfsmitel damit bei einer exception nicht vergessen wird das dispose aufzurufen.
Ich komme von der Win32 API und hab da noch ein paar Verständnisprobleme mit der 'managed'-Geschichte, deshalb frag ich ja. Aber ich glaube jetzt hab ich es verstanden: >hast du dir überhaupt mal durchgelesen wofür using da ist? Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF nicht die Daten im Speicher verschoben werden. >Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist >doch gut. Und die Gefahr, dass das MMF gelöscht wird, existiert nicht.
Peter schrieb: >>hast du dir überhaupt mal durchgelesen wofür using da ist? > Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF > nicht die Daten im Speicher verschoben werden. wo hast du den satz her? Diese funktion von using ist mir bis jetzt nicht bekannt und auch irgendwie unglaubwürdig. Forum: PC-Programmierung MemoryMappedFiles und Garbage Collector im .NET Forenliste | Threadliste | Neuer Beitrag | Suchen | Anmelden | Benutzerliste | Bildergalerie | Hilfe | Login MemoryMappedFiles und Garbage Collector im .NET Autor: Peter (Gast) Datum: 04.05.2012 15:40 Hi, ich brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im Speicher bleibt. Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen? Gruß Peter Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Peter II (Gast) Datum: 04.05.2012 15:49 Peter schrieb: > Kann man dem Garbage Collector irgendwie ein Schnippchen schlagen? bist du sicher das er sich überhaupt darum kümmert? Re: MemoryMappedFiles und Garbage Collector im .NET Autor: bubu (Gast) Datum: 04.05.2012 15:49 Naja, du musst nur das Programm forken. Solang du das geforkte Programm offen hälst, sollte dein file im RAM bleiben. Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Thomas (Gast) Datum: 04.05.2012 15:49 Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff. Gruß Thomas Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Peter II (Gast) Datum: 04.05.2012 15:52 bubu schrieb: > Naja, du musst nur das Programm forken. Solang du das geforkte Programm > offen hälst, sollte dein file im RAM bleiben. was hat forken mit einem MemoryMappedFiles zu tun? Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht mehr ansprechen. Ich versteht das Problem nicht. Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Udo Schmitt (urschmitt) Datum: 04.05.2012 16:00 Peter schrieb: > ch brauche ein MMF in meiner C# Anwendung, dass die ganze Zeit über im > Speicher bleibt. Definiere "die ganze Zeit". Laufzeit des Programms? Laufzeit mehrerer Instanzen des Programms. Laufzeit mehrerer unterschiedlicher Programme, die auf dieses MMF zugreifen. Allgemein: Solange ein Programm ein Handle auf dieses MMF hält wird das MMF wohl nicht weggeworfen. Ich denke auch (weiss es aber nicht) daß die Verwaltung von MMFs vom Betriebssystem und nicht vom GC von C# gemacht wird. Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Peter (Gast) Datum: 04.05.2012 16:01 >bist du sicher das er sich überhaupt darum kümmert? Nein, bin ich nicht :) ABER >Klar, Du kannst Speicherbereiche sperren. Sorry mir fällt grad nicht die >genaue Methode ein. Schau mal unter Byte Array und Pointerzugriff. In den Beispielen wird das mit void OpenMMF() { using { //Hier sind die MMF's sicher ... } } gemacht. Aber wie soll das gehen? Sobald ich die Funktion verlasse hört auch mein 'using'-Bereich auf? >Naja, du musst nur das Programm forken. Solang du das geforkte Programm >offen hälst, sollte dein file im RAM bleiben. Was heisst 'forken'? >Wenn du eine Referez auf den Speicher hast dann wird er auch nicht vom >GC entfernt, wenn du keine Referenz mehr hast kannst du ihn auch nicht >mehr ansprechen. Ich versteht das Problem nicht class Test { MemoryMappedFile m_mmf; Test() { m_mmf = MemoryMappedFile.Create("testmap"); } } Das heisst also, wenn ich das so mache, dann wird mir da nichts 'wegoptimiert'? Mein m_mmf ist durchweg gültig? Aber warum wird dann immer mit 'using' gearbeitet? Gruß Peter Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Peter II (Gast) Datum: 04.05.2012 16:08 Peter schrieb: > Sobald ich die Funktion verlasse hört > auch mein 'using'-Bereich auf? hast du dir überhaupt mal durchgelesen wofür using da ist? http://msdn.microsoft.com/de-de/library/yh598w02%2... Damit kann man sicherstellen das danach wieder aufgefäumt wird. Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist doch gut. Das ganze hat wenig mit dem GC oder mit dem optimerer zu tun. Es ist nur ein hilfsmitel damit bei einer exception nicht vergessen wird das dispose aufzurufen. Re: MemoryMappedFiles und Garbage Collector im .NET Autor: Peter (Gast) Datum: 04.05.2012 16:18 Ich komme von der Win32 API und hab da noch ein paar Verständnisprobleme mit der 'managed'-Geschichte, deshalb frag ich ja. Aber ich glaube jetzt hab ich es verstanden: >hast du dir überhaupt mal durchgelesen wofür using da ist? Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF nicht die Daten im Speicher verschoben werden. >Wenn du das nicht brauchst dann weil das das objekt global anlegst dann ist >doch gut. Und die Gefahr, dass das MMF gelöscht wird, existiert nicht. nein, warum auch. Damit könnte man überhaupt nicht sinnvoll programmieren.
sorry für das merkwürdige post, irgendwie hat das einfügen nicht geklappt.
>nein, warum auch. Damit könnte man überhaupt nicht sinnvoll >programmieren. Das macht Sinn! Jedenfalls bin ich jetzt etwas schlauer :) Danke!
http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx http://msdn.microsoft.com/en-us/library/dd997372.aspx
1 | class Test |
2 | {
|
3 | MemoryMappedFile m_mmf; |
4 | |
5 | Test() |
6 | {
|
7 | m_mmf = MemoryMappedFile.Create("testmap"); |
8 | }
|
9 | }
|
So kann man nicht in jedem Fall sicher sein bzw. es hängt davon ab wo, wer, wie eine Instanz dieser Klasse referenziert. Siehe GC.KeepAlive(), ansonsten hilft static bzw. statischer Konstruktor bzw. Singleton.
Ok, danke! Das werd ich mir mal anschauen und berücksichtigen.
>wo hast du den satz her? Diese funktion von using ist mir bis jetzt >nicht bekannt und auch irgendwie unglaubwürdig. http://msdn.microsoft.com/de-de/library/zhdeatwt%28v=vs.80%29.aspx Gruß Peter
Peter schrieb: >>wo hast du den satz her? Diese funktion von using ist mir bis jetzt >>nicht bekannt und auch irgendwie unglaubwürdig. > http://msdn.microsoft.com/de-de/library/zhdeatwt%2... > > Gruß Peter ich meinte diesen Satz: > Mit 'using' wird sichergestellt, dass während eines Zugriffs auf das MMF > nicht die Daten im Speicher verschoben werden. und dieser steht nicht in diesem link.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.