Datei nicht auf SD Karte speichern sondern in RAM auslagern

  • Hallo,

    ich habe gelesen, dass SD Karten nicht "ewig" beschrieben werden können und sie irgendwann nicht mehr beschreibar sind.

    Leider speichere ich alle 2 Sekunden einen Wert in eine txt datei und lese diese wieder aus.

    Kann man, dass nicht so machen dass die Daten von diesem txt file nur im RAM gespeichert werden.

    Vielleicht hat das schon jemand probiert.

    Würde mich sehr über eure Hilfe freuen.

    DANKE :danke_ATDE:

  • Datei nicht auf SD Karte speichern sondern in RAM auslagern? Schau mal ob du hier fündig wirst!

  • Das wurde hier schon oft diskutiert - das Thema heisst RAM-Disk, und die Foren-Suche bzw. das FAQ sollten da helfen.

  • Um was für eine Datei handelt es sich - also wie wichtig ist es dass sie ein Reboot übersteht?


    Das einfachste wäre die Datei einfach in /dev/shm/ abzulegen. Das ist tmpfs und meist 1/2 des verfügbaren Arbeitsspeichers automatisch vom Kernel erzeugt.
    Alternativ (und das sollte jeder so oder so machen) tmpfs für /tmp/ aktivieren und dann dort ablegen.

    Wie __deets__ bereits erwähnte, findet man irgendwo in FAQ => Nützliche Links / Linksammlung entsprechende Beiträge ;)


    PS: ramfs ist was anderes als tmpfs. Irgendwo in der Linksammlung wird auch das beschrieben.

  • Hallo,

    wenn die Daten nach dem Ausschalten noch vorhanden sein sollen kann man die Datei auch auf einen USB-Stick speichern. Die halten zwar auch nicht ebig, sind aber preiswert zu ersetzen und wenns wirklich passiert, dann ist das System nicht zerschossen.

    Für binäre Daten in übeschaubarer Größe ( also wenn man nicht gerade Romane schreibt) verwende ich FRAM über i2c. Speichern geht sehr schnell, praktisch fast keine Begrenzung der Schreibzyclen, Daten werden ohne Batteriepufferung gespeichert(also keine Batterie erforderlich), es gibt tapen mit 3,3 V die sich direkt anschließen lassen und preiswert sind sie auch.


  • wenn die Daten nach dem Ausschalten noch vorhanden sein sollen kann man die Datei auch auf einen USB-Stick speichern. Die halten zwar auch nicht ebig, sind aber preiswert zu ersetzen und wenns wirklich passiert, dann ist das System nicht zerschossen.

    USB-Sticks basieren ebenso wie SD Karten auf NAND-Flash, haben also ebenso eine begrenzte Haltbarkeit. Wenn die Dateien keine mehrere 100 MB groß werden spricht m.E. nichts dagegen diese in ein tmpfs abzulegen, da verschleißt nichts. FRAM hat ebenfalls eine Schreibzyklen Begrenzung.

    Allerdings wäre allgemein fraglich wieso Er alle 2 Sekunden irgendwelche Werte in eine Datei schreibt und sie dort ggf im selben Intervall auch wieder ausliest :s Das hört sich für mich (und vermutlich auch für ruedigerp) nach einem falschen Konstrukt an


  • verwende ich FRAM über i2c. Speichern geht sehr schnell, praktisch fast keine Begrenzung der Schreibzyclen, Daten werden ohne Batteriepufferung gespeichert(also keine Batterie erforderlich), es gibt tapen mit 3,3 V die sich direkt anschließen lassen und preiswert sind sie auch.

    Wow! Ich wusste gar nicht, dass es die schon zu kaufen gibt...

    Nun könnte ja mal ein USB Stick mit FRAM kommen... oder kennt jemand sowas ?


  • Was für Daten musst Du denn alle 2 Sekunden lesen und schreiben?


    Hallo,
    das brauch ich für einen Heizlüfter.
    Die Tempereratur wird alle 2 Sekunden gemessen und in einem txt file gespeichert. Ein anderes Programm öffnet dieses file und weiß die aktuelle Tempereratur.

    Wenn ich Temperatur und Heizungsregelung ein einem Programm mache gehts nicht so gut.

  • Wenn du die Daten nur von einem zum anderen Programm schrieben willst, kannst du das mit einer "named-Pipe" machen.
    Programm-1 kann da Daten reinschreiben und Programm-2 die weder rausholen. Selbst wenn Programm-1 mehr reinschreibt, als Programm-2 sie lesen kann, läuft alles, bis die named-Pipe voll ist ;)
    Steht nichts drin, wartet Programm-2, bis Programm-1 wieder etwas hinein schreibt.

    https://de.wikipedia.org/wiki/Pipe_(Inf…#Pipe-Varianten
    Mit Beschreibung für die verschiedenen Pipe-Varianten bei Unix.

    Computer ..... grrrrrr

  • Schon einmal überlegt etwas zu benutzen was im RAM läuft? Memcached oder redis?
    Du musst dafür ja nicht viel RAM konfigurieren. Das braucht in deinem Fall ja nur ein paar kb maximal.

    Das erst macht dann einfach ein SET auf der anderen Seite ein GET. Memcached schreibt eh nicht auf die Platte. Bei redis einfach sagen er soll nur alle paar Jahre Speichern. ;)

    Oder wie vom Raspi-Berlin gerade geschrieben per Pipes.


  • Die Tempereratur wird alle 2 Sekunden gemessen und in einem txt file gespeichert. Ein anderes Programm öffnet dieses file und weiß die aktuelle Tempereratur.

    Und womit machst du das? Wenn beides Python ist, dann lös lieber das Problem anstatt es derart einfacher zu ignorieren...


  • Wenn ich Temperatur und Heizungsregelung ein einem Programm mache gehts nicht so gut.

    Wäre doch eine gute Idee, sich das Programm vorzunehmen und zu untersuchen, warum "es nicht so gut " geht.

    Weil: das mit dem File schreibenist eine Krücke
    Und "namedPipes" sind sind eigentlich für sowas auch nicht das Mittel der Wahl.

    Vielleicht magst du uns das Problem, welches du hattest als du beides in einem Programm gemacht hast, mal vorstellen?
    Hier im Forum kann dir da sicher geholfen werden :)

  • Hallo,

    Noch mal zum Thema FRAM. Typen mit 5 V Betriebsspannung gibts bei Reichelt. Da brauchst Du aber eine Pegelanpassung. 3,3 V Typen beziehe ich von Farnell. Die vergleichbaren Typen gibt es meistens als i2c und auch als SPI zum gleichen Preis.

    Ich bevorzuge i2c. Da kosten 64 Kilobit (8Kilo x 8 Bit Datenbreite ) ca 2-3 €. Wer keine offizielle Rechnung braucht findet so was in China sicher sogar noch billiger. Typen ab 32 KBit, mit 16 Bit Adressbreite lassen sich nicht mit den Betriebssystem Tools ansprechen. Ob sowas in Python geht weis ich nicht. In Lazarus könnte ich da aber weiter helfen.

  • Wie wärs mit globalen Variablen ??

    ;) Gruß Outi :D
    Pis: 2x Pi B (Rente) / 1x Pi B+ (Rente) / 1x Pi 2 B (Rente) / 2x Pi 3 B (RaspberryMatic / Repetier Server) / 2x Pi Zero 1.2 (B. Lite) / 2x Pi Zero 1.3 (B. Lite) / 2x Pi Zero W 1.1 (B. Lite) / 1x Pi Zero 2 (mal so, mal so) / 1x Pi 3 B+ (Tests) / 1x Pi 4 B 4GB (BW Lite (Webserver)) / Pi 400 (BW) / 1x Pi 5 (BW) / 2x Pi Pico / 2x Pi Pico W
    Platinen: Sense HAT / HM-MOD-RPI-PCB / RPI-RF-MOD / PiFi DAC+ V2.0 / TV HAT / Pi 5 Kühler HAT
    Kameras: orig. Raspberry Pi Camera Module V1 & V3 / PS3 Eye

  • Hier gings um Werte zwischen 2 Programmen auszutauschen, was der TE bisher wohl über eine Datei bewerkstelligt und sich bez. der Schreibzyklen der SD Karte Sorgen macht.

    Was hat das ganze Thema mit Interprozesskommunikation zu tun ??

    Er haut einen Wert alle 2 Sekunden in eine Variable (wo sind Variablen üblicherweise ?? Ja, im RAM) und liest diese wieder aus, fertig. Kein Schreibzyklus, kein "Abrieb einer Speicherzelle".

    ;) Gruß Outi :D
    Pis: 2x Pi B (Rente) / 1x Pi B+ (Rente) / 1x Pi 2 B (Rente) / 2x Pi 3 B (RaspberryMatic / Repetier Server) / 2x Pi Zero 1.2 (B. Lite) / 2x Pi Zero 1.3 (B. Lite) / 2x Pi Zero W 1.1 (B. Lite) / 1x Pi Zero 2 (mal so, mal so) / 1x Pi 3 B+ (Tests) / 1x Pi 4 B 4GB (BW Lite (Webserver)) / Pi 400 (BW) / 1x Pi 5 (BW) / 2x Pi Pico / 2x Pi Pico W
    Platinen: Sense HAT / HM-MOD-RPI-PCB / RPI-RF-MOD / PiFi DAC+ V2.0 / TV HAT / Pi 5 Kühler HAT
    Kameras: orig. Raspberry Pi Camera Module V1 & V3 / PS3 Eye

  • Zwei Programme == zwei Prozesse. Daten austauschen zwischen zwei Programmen == Interprozesskommunikation.

    Und zwei Programme teilen sich keinen RAM. Das verhindert das OS. Sonst schaue ich mit meinem Skript was du für Passwörter im Browser eingibst.

    Also werd mal konkret: wie legt ein Programm diese Variable an, und wie greift das andere zu?

  • Also erstmal: No Panik! Wenn Du alle 2 Sekunden einige Bytes in ein File schreibst, dann wird das erstmal von Kernel im Ram zwischengespeichert, bis 4096 Bytes zusammengekommen sind. Die werden dann auf einmal auf das Dateisystem geschrieben. Jedenfalls gilt dies, solange das File nicht geschlossen wird, und solange kein expliziter FLUSH getriggert wird. Wenn zwischenzeitlich ein anderes Programm die Daten lesen möchte, kann es sein, dass es die Daten nicht lesen kann, weil sie noch nicht geschrieben wurden, oder dass es die Daten bereits erhält, aber aus dem Zwischenspeicher. Ich habe etwas rumprobiert und es scheint, dass die Daten erst lesbar sind, wenn sie tatsaechlich geschrieben wurden. Das zweite Programm würde so die Daten erst verzögert erhalten. Wenn das egal ist, gehts so. Wenn nicht, muss man tatsaechlich nach jedem schreiben von Messdaten ins File dieses entweder schliessen und wieder öffnen (mit APPEND) oder ein FLUSH ausführen. Das führt aber zu einem Schreibvorgang, auch wenn die 4096 Bytes noch nicht voll sind, und dann wird tatsächlich mehrmals geschrieben. Das sollte man dann anders realisieren.

    Wenn Du die Daten in eine Datei in der RAMDISK schreibst, dann ist es kein Problem, aber die Daten können bei einem Stromausfall verlorengehen. Wenn das egal ist, mach es so, wenn nicht, dann wird es kompliziert. Vielleicht kannst Du die Daten über eine Ramdisk an das Zweite Programm übermitteln, und das zweite Programm sorgt dann für die dauerhafte Speicherung auf der SDkarte, also in ein File dort schreiben, ohne es zu schliessen zwischendurch. Statt einer Ramdisk ist es üblicher, eine PIPE zu verwenden, oder die Beiden Programm direkt über stdout --PIPE--stdin zu verbinden, wenn stdout nicht anderweitig benutzt wird, z.B. für Meldungen in ein Terminal. Wenn das auch nicht geht, dann käme nich Interprozesskommunikation über SHARED MEMORY und Semaphoren oder messages in Frage. Dies ist aber etwas aufwändig zu programmieren.
    Automatisch zusammengefügt:
    Ich habe noch eine Idee, wie es mit kleinstem AUfwand/Modifikation der vorhandenen Programme gehen könnte:
    Schreib die Daten einfach ein Zwei Files, eines auf der SD-Karte zum Archivieren, und ein zweites in der RAmdisk, damit es vom Zweiten Prozess gelesen werden kann. Dann kannst Du das File in der Ramdisk auch immer mit dem einzigen aktuellen Wert überschreiben, dann hat das zweite Programm es nicht so schwer, sich bis nach ganz unten für den aktuellen Wert vorzuarbeiten.

    Einmal editiert, zuletzt von wend (18. Januar 2017 um 10:03)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!