C C 如何將不停的資料流儲存成乙個固定大小的檔案?

時間 2021-05-31 16:54:44

1樓:幣哥

這樣的話你還得維護檔名,排序啥的,還要經常檢查檔案大小、檢查磁碟空間夠不夠,我建議不要這樣做,首先每條log長度是不是固定的?如果不能固定可不可以把最大長度做為固定長度?這樣就把長度固定下來,然後就是固定存多少條記錄,算出磁碟空間需要多大,按這個大小分配好檔案的大小,內容全置為0,每次按偏移量覆蓋最老的一條資料,迴圈往復,然後頭尾相接處做乙個標記;如果log長度不是固定的,你就分配大小為10m的乙個檔案,內容也全置為0,原理和固定長度一樣,只不過多幾種情況判斷,比如將要寫入的加已存在的資料長度大於10m,就從頭寫,頭部第一條資料如果小於新資料那麼就覆蓋n條。

再優化一下就是在記憶體中做快取,先在記憶體中改資料,然後同步到磁碟盤上,只同步此次被修改的資料,你還可以增加執行緒專門處理它,由於寫磁碟比較慢,這樣就不會脫累其它工作執行緒了。

2樓:Code Hz

題主說的是乙個檔案,那我就提供乙個單檔案的方案好了。

這個方案需要設計檔案頭部,基本資料域有,起始偏移,終止偏移,根據需要可以加上最後一條記錄產生時間,檔案總大小(如果未來長度不一定為10M),寫入完整性標記等等

然後寫入資料就和一般的迴圈佇列沒啥兩樣了。需要注意的是,根據輸入資料的格式,在空間不足的時候要有不同的移動起始偏移的策略,比如結構化資料就一次性移動乙個結構,非結構化資料則移動輸入資料的長度等等

這個方案一旦使用,那就得配套加上相應的讀取程式,因而有一定的侷限性,但是,總比每次超出都移動整個檔案內容要安全和有效率多了

----更新----

這個方法有執行緒安全問題,設想兩個執行緒同時寫入,就有可能會出現問題,這個時候可以利用常見鎖定來解決問題,如果有很多多執行緒寫入的需求,可能需要在記憶體里弄乙個無鎖佇列來緩衝,然後日誌執行緒一次性寫入好幾個資料--不管怎麼說,要保證檔案的讀寫同步的進行

如何將不同的執行緒設定不同頻率呢?

已登出 gcc otest test.c testp2 hello worldp2 hello worldp1 hello worldp2 hello worldp2 hello worldp1 hello worldp2 hello worldp2 hello world C cattest.c ...

如何將json的資料轉化成csv的資料格式?

隨風潛夜 需求確認 將json資料轉化為csv的資料格式JSON可以有兩種格式,一種是物件格式的,另一種是陣列物件格式 物件格式 陣列物件格式 這裡介紹其中一種 陣列物件格式34 ttery min issue 20130801 3391 code 84529 code1 297734529 cod...

請問r語言中如何將資料分組

Winmin x rnorm 1000,0,1 x1 sort x,decreasing F for i in 1 10 a x1 1 i 1 100 i 100 print names table a which.max table a zhuobie 我說乙個比較簡單的辦法。將x1轉化為100 ...