2016-07-25 7 views
0

Ich habe einen 2M-Byte-Speicher, um einige Protokolle in unserem Embedded-Gerät (Linux Base) zu speichern. Da die Größe sehr begrenzt ist, müssen wir einen Ansatz implementieren, um die maximale Größe zu erreichen. Eine Option ist der Ringpuffer mit mmap für die Persistenz. Die andere Option ist sqlite3 (wenn die maximale Größe erreicht ist, löschen Sie die ältesten Einträge, fügen Sie neue ein).sqlite3 wenn Plattenspeicher erreicht

Soweit ich weiß, verwendet sqlite3 Seiten (Limit 4096K oder konfigurierbar). Meine Fragen sind:

  1. Wie Berechnung der Festplattennutzung von sqlite3? Neben der Dateigröße der Datenbank, was wird hier auch benötigt?

  2. Was passiert, wenn 2M erreicht wird? Gibt es eine bestimmte Information oder einen Fehler, den ich überprüfen könnte, um die ältesten Einträge zu löschen?

  3. ist es ein guter Ansatz (leistungs weise, datensegmentierungs weise) Einträge zu löschen und neue einzufügen?

Alle Vorschläge oder Rückmeldungen sind willkommen.

Antwort

1

Es ist nicht möglich, die Festplattenbelegung zu berechnen; Sie müssen die Datei überwachen. Neben der eigentlichen Datenbankdatei gibt es auch das Rollback-Journal, dessen Größe der Menge der geänderten Daten in einer Transaktion entspricht.

Wenn der Datenträger voll ist, erhalten Sie einen Fehlercode von SQLITE_FULL (oder vielleicht SQLITE_IOERR_WRITE, je nach Betriebssystem).

Sie können die Datenbankgröße mit PRAGMA max_page_count begrenzen.

Gelöschte Zeilen führen zu mehr freiem Speicherplatz in dieser bestimmten Datenbankseite. (Die Dateigröße wurde nie geändert, es sei denn, Sie führen aus.) Beim Einfügen neuer Zeilen am anderen Ende der Tabelle kann der Speicherplatz nur wiederverwendet werden, wenn die gesamte Seite freigegeben wurde, weil alle Zeilen gelöscht wurden. Sie sollten also versuchen, Zeilen in großen Blöcken zu löschen, wenn möglich.

+0

danke.CL. Ich machte eine Schleife, um die Einträge mehrmals einzufügen und zu löschen (jeder wird durch sqlite_exec Komfortfunktion über 2M getan), ich erwarte, dass die Dateigröße wächst. es bleibt jedoch gleich. Dies ist ein wenig widersprüchlich, wenn der freie Speicherplatz nur von VACCUM zurückgenommen wird. Wo befindet sich auch die Rollback-Journaldatei? Ich finde nur die Datenbankdatei im Verzeichnis. – pepero

+0

Freier Speicher * kann * von anderen Zeilen wiederverwendet werden; VACUUM beeinflusst die Dateigröße. Mit der Standardeinstellung [setting] (http://www.sqlite.org/pragma.html#pragma_journal_mode) wird das Rollback-Journal nach jeder Transaktion gelöscht. –

+0

Ja, Rollback-Journal ist nur eine temporäre Datei. Ich hab es jetzt. Ich habe auch versucht, z. 2M Zeilen, die zum Beispiel Größe 82066432 Bytes Datenbankdatei ergibt, dann lösche ich alle diese Zeilen. Die Dateigröße wird nicht verkleinert. – pepero

Verwandte Themen