SD-Karte: Datei schließen notwendig ? Und Frage zur String-Nutzung

Hallo,
ich habe je eine Frage zum Handling von SD-Karten und zu Strings.
Hintergrund ist der Bau eines Datenloggers auf Basis WEMOS Lolin ESP32 via Arduino IDE 1.8.8.
Es wird für die SD-Karte diese Lib verwendet: GitHub - nhatuan84/esp32-micro-sdcard

1.) Wenn man eh nur eine einzelne Datei auf der SD-Karte nutzt, die gelegentlich mit Meßdaten erweitert wird:
Macht es Sinn, innerhalb des Programms die Datei überhaupt zu schließen, hier über den Befehl myFile.close();
Es geht ja auch ohne schließen.
Oder gibt es da Seiteneffekte, die erst nach einiger Zeit auftreten ? Der Datenlogger soll Wochen bis Monate durchlaufen
Wenn auf das andauernde Öffnen und Schließen der Datei pro Zeile verzichtet wird, kann ich innerhalb von <10ms meine Daten (ca. 40byte) auf die Karte schreiben, sonst benötigt das Programm > 20ms.
Die Zeit ist hier relevant, um für das Wegschreiben auf SD-Karte den µC nur möglichst kurz zu blockieren.

2.) Derzeit bastele ich mir meine Daten zum Anzeigen via Strings zeilenweise zusammen, wie z.B.

Ausgabestring += Datum;
Ausgabestring += ',';
Ausgabestring += Zeit;
Ausgabestring += ',';
Ausgabestring += Datenstring1;
Ausgabestring += ',';
Ausgabestring += Datenstring2;
[...]

Jetzt lese ich häufiger die Warnungen generell Strings beim Arduino wg. der Speicherfragmentierung zu nutzen.
Da ich den Ausgabestring oben einmal pro Loopdurchlauf neu schreibe: Mülle ich mir auch damit mein RAM zu ?
Kann das evtl. durch eine lokale Variablendeklaration in Loop verhindert werden, oder macht das das nur schlimmer ?
Einerseits ist die Alternative Char-Arrays zu nutzen für mich einfach weniger intuitiv, andererseits soll der Logger lange laufen, ohne daß mir der Datenmüll den µC stoppt.

Bevor Kommentare kommen: Die Daten sollen nur rel. selten Blockweise (geschätzt 100 Zeilen à 40 Zeichen) nach einem externen Trigger auf SD-Karte geschrieben, es findet kein kontinuierliches Beschreiben der Karte statt.

Danke!

Tütenflieger

ESP32 und Deine Lib kenne ich nicht, aber bei SdFat gibt es ein Beispiel cin_cout.ino mit ArduinoOutStream, wo dann sowas möglich ist:

cout << "Invalid input: " << cinBuf;
cout << w1 << "  " << w2 << "  " << w3 << "  " << w4 << endl;

Eventuell könntest Du da was abschauen.

Hallo,

auf dem ESP32 darf man sich die String Klasse duraus leisten wenn man es nicht übertreibt.
Probleme mit Speicherfragmentierung gibt es zwar prinzipiell genauso auf, wenn man z.B. Webserverkram mit großen Datenmengen als String verarbeitet.
Auf dem ESP8266 bin ich bei mehr als 4k in einem String und ca. 20x String.replace() auf diesen String angewendet habe. Man kann es eben auch übertreiben mit den Strings.

Das SD-File schließen hat noch einen weiteren Grund: die Daten landen in einem Ram-Buffer und werden Blockweise auf die Karte geschreiben, wenn der voll ist. close() erzwingt das Schreiben des Biffers auf die Karte, selbst wenn nur ein Byte geändert wurde. Es ist also ein Kompromiß auch zwischen Kartenlebensdauer und Datensicherheit. Bei Spannungsaufall sind die Daten aus dem Buffer eben weg und wenn man Pech hat, auch das Dateisystem korrupt.

Gruß aus Berlin
Michael

Ich würde die Datei zumindest ab und zu schließen sonst kann es dir passieren dass - z.B. nach einem ungeplantem Programmende wie Stromausfall oder Reset die gesamt Datei nicht lesbar ist.