2015-11-14 95 views
0

我有一個Python腳本,記錄外部SSD上相機的動作。計算機(一個Raspberry Pi)很有可能會受到影響,並與驅動器斷開連接(甚至是從電源斷開,但這是另一個話題嗎?),但是我想在發生這種情況時不會丟失數據。它可以實現嗎?有沒有辦法在SSD上寫入,如果在寫入過程中斷開連接,沒有數據丟失?

我讀過,當驅動器沒有安全彈出時,只有最後一個寫週期丟失。寫週期究竟是什麼,我如何可能用它來實現我想要的?也許我可以寫5秒的塊(有5秒的寫週期),這樣,如果SSD斷開連接,只會丟失5秒,你覺得怎麼樣?

這將如何適用於代碼?

現在我正在使用Picamera庫,它使用文件流。如果SSD斷開連接,那麼流沒有足夠的時間來訪問數據流,這就是數據丟失的原因嗎?在我的測試中,當我斷開SSD的連接時,無論我錄製的時間長度是1分鐘還是15秒,我都只能看到視頻的前2-3秒。

右斷開SSD後,我就會在控制檯中一些內核錯誤消息(Linux):

Message from [email protected] at Nov 12 01:43:41 ... 
kernel:[ 138.263099] Internal error: Oops: 5 [#1] PREEMPT SMP ARM 

Message from [email protected] at Nov 12 01:43:41 ... 
kernel:[ 138.366239] Process vc.ril.video_en (pid: 2403, stack limit = 0xb47c0210) 

Message from [email protected] at Nov 12 01:43:41 ... 
kernel:[ 138.374211] Stack: (0xb47c1c80 to 0xb47c2000) 

Message from [email protected] at Nov 12 01:43:41 ...\ 
kernel:[ 138.379835] 1c80: 00000000 b5b84ce0 807fd650 b667536c a0000013 00000000 b47c1ccc b47c1ca8\ 

... 

在這個控制檯會話凍結一切。

有時,但更少(大約1/10次),內核不會給出錯誤,但腳本會產生一個異常(IOError: [Errno 5] Input/output error)並在控制檯中顯示堆棧跟蹤。

任何見識都被讚賞!

乾杯!

+0

除非您計劃在將數據寫入硬盤前將數據存儲在內存中,否則答案可能爲「否」。但是這也取決於你的系統有多少內存以及你正在使用什麼文件編碼。 – Makoto

+0

當您說「除非您計劃在將數據寫入硬盤之前將數據存儲在內存中」,那麼您的意思是保存數據直到SSD插入計算機?該系統有1GB的RAM和文件編碼是H264。雖然視頻以1080p30錄製,但空間會很快填滿,儘管它可能是一個解決方案。 – maximedupre

+2

定期調用fsync()或sync()會強制將數據寫入磁盤。在同步調用返回之前,fsync()或sync()之前的任何write()調用都將被髮送到磁盤。將會有一次性能下降,可能是非常大的一次。 – Evan

回答

0

所以這是我做了什麼,以確保只有數據的一個非常小的量丟失。

  1. 關掉文件對象的緩衝模式通過使0到open方法的buffering參數(僅在二進制模式下打開文件時的工作原理。例如open(fileName, 'wb+', 0))。您也可以手動調用flush一個write後清空文件緩衝區。
  2. 正如指出由@Evan,週期性地調用syncfsync迫使要寫入磁盤的數據。在同步調用返回之前,fsync()或sync()之前的任何write()調用都將被髮送到磁盤。將會有一次性能下降,可能是非常大的一次。
0

當您的應用程序調用「write()」時,Linux實際上不會寫入磁盤。 (如果有,一切都將是非常緩慢的。)

的原因是磁盤的速度非常慢,在「求是」(磁盤走動),但速度非常快,在「流」(將數據寫入順序)。所以Linux會將數據緩衝在內存中,然後將它全部寫入大量的順序數據塊中。

默認情況下它是寫出來之前,Linux將數據保存在內存中長達30秒。如果這對你來說太大,你可以調整它。嘗試使用echo 500 > /proc/sys/vm/dirty_expire_centiseconds來嘗試每5秒寫出一次數據。

參見: http://www.westnet.com/~gsmith/content/linux-pdflush.htm https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/

+0

如果Linux在內存中保留了30秒的數據,當我在磁盤上寫入1分鐘時,我怎樣才能獲得2-3秒的剪輯?我不應該得到30秒的剪輯?而且,如果我在磁盤上寫入20秒,爲什麼會得到2-3秒的剪輯? – maximedupre

+0

也許之所以我錄製15秒鐘的時間爲2-3秒,是因爲Picamera在開始時調用了'fsync'。也許我在記錄1分鐘時得到2-3秒剪輯的原因是我沒有調用'flush',這會將數據留在Python緩衝區中,而不允許操作系統處理它。 – maximedupre

相關問題