2016-07-25 95 views
0

我有一個2M字節的存儲空間來存儲我們的嵌入式設備(Linux基地)的一些日誌。由於尺寸非常有限,我們必須實施一些方法來處理達到最大尺寸的情況。一種選擇是使用mmap進行持久化的循環緩衝區。我們正在考慮的另一個選擇是使用sqlite3(當達到最大大小時,刪除最舊的條目,插入新的條目)。當磁盤存儲達到時sqlite3

但據我所知,sqlite3使用頁面(限制4096K或可配置)。我的問題是:

  1. 如何從sqlite3計算磁盤使用情況?除了數據庫文件的大小,還需要在這裏計數?

  2. 當達到2M時會發生什麼?是否有任何特定的信息或錯誤,我可以檢查刪除最舊的條目?

  3. 這是一個很好的方法(性能明智,數據分割明智)刪除條目,然後插入新的?

歡迎任何建議或反饋。

回答

1

無法計算磁盤使用率;你必須監視文件。除了實際的數據庫文件之外,還有回滾日誌,其大小對應於事務中更改的數據量。

當磁盤已滿時,您將收到SQLITE_FULL錯誤代碼(或者SQLITE_IOERR_WRITE,具體取決於操作系統)。

您可以使用PRAGMA max_page_count限制數據庫大小。

刪除的行導致該特定數據庫頁面中的可用空間更多。 (除非運行VACUUM,否則這絕不會改變文件大小。) 在表的另一端插入新行時,只有當整個頁面因其所有行被刪除而被釋放時,該空間才能被重用。 所以你應該嘗試刪除大塊中的行,如果可能的話。

+0

thanks.CL。我做了一個循環來多次插入和刪除條目(每個都通過2M以上的sqlite_exec便利功能完成),我預計文件的大小會增加。但是,它仍然是一樣的。如果可用空間僅由VACCUM收回,這有點矛盾。還有回滾日誌文件在哪裏?我只能在目錄中找到數據庫文件。 – pepero

+0

可用空間*可以被其他行重用; VACUUM影響文件大小。使用默認[設置](http://www.sqlite.org/pragma.html#pragma_journal_mode),回滾日誌在每次事務之後被刪除。 –

+0

是的,回滾日誌只是臨時文件。我現在明白了。我也嘗試插入,例如2M行,這會導致例如82066432字節數據庫文件的大小,然後我刪除所有這些行。文件大小不縮小。 – pepero