第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用內(nèi)存映射文件或普通 Stream.Write 時是否有任何持久性保證

使用內(nèi)存映射文件或普通 Stream.Write 時是否有任何持久性保證

C#
三國紛爭 2022-07-23 18:01:55
我有很多數(shù)據(jù)想以二進(jìn)制形式保存到磁盤,我想盡可能接近具有 ACID 屬性。由于我有大量數(shù)據(jù)并且無法將其全部保存在內(nèi)存中,因此我知道我有兩種基本方法:有很多小文件(例如每分鐘左右寫入磁盤) - 如果發(fā)生崩潰,我只會丟失最后一個文件。然而,性能會更差。有一個大文件(例如打開、修改、關(guān)閉) - 之后的最佳順序讀取性能,但如果發(fā)生崩潰,我最終可能會得到一個損壞的文件。所以我的問題是:如果我選擇使用大文件選項(xiàng)并將其作為內(nèi)存映射文件(或使用Stream.Positionand Stream.Write)打開,并且斷電,是否可以保證文件可能會發(fā)生什么?是否有可能丟失整個大文件,或者最終導(dǎo)致數(shù)據(jù)在中間損壞?NTFS 是否確保一定大?。?k?)的塊總是被完全寫入?Unix/ext4 上的結(jié)果更好/更差?我想避免使用 NTFS TxF,因?yàn)槲④浺呀?jīng)提到它計(jì)劃停用它。我正在使用 C#,但語言可能無關(guān)緊要。(補(bǔ)充說明)似乎應(yīng)該有一定的保證,因?yàn)?- 除非我錯了 - 如果在寫入文件時可能會丟失整個文件(或遭受非常奇怪的損壞),那么現(xiàn)有的數(shù)據(jù)庫將不會是 ACID,除非他們1) 使用 TxF 或 2) 在寫入之前復(fù)制整個文件?如果您丟失了您甚至不打算觸摸的部分文件,我認(rèn)為日記不會幫助您。
查看完整描述

2 回答

?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個贊

您可以調(diào)用FlushViewOfFile,它啟動臟頁寫入,然后FlushFileBuffers,根據(jù)本文,它保證頁面已被寫入。

每次寫入后調(diào)用FlushFileBuffers可能“更安全”,但不建議這樣做。你必須知道你能承受多少損失。有一些模式可以限制這種潛在的損失,即使是最好的數(shù)據(jù)庫也可能遭受寫入失敗。您只需要以盡可能少的損失恢復(fù)生活,這通常需要一些多階段提交的日志記錄。

我想可以打開內(nèi)存映射文件, FILE_FLAG_NO_BUFFERING但這FILE_FLAG_WRITE_THROUGH會消耗你的吞吐量。我不這樣做。我為異步 I/O 打開內(nèi)存映射文件,讓操作系統(tǒng)通過它自己的異步 I/O 完成端口實(shí)現(xiàn)來優(yōu)化吞吐量。這是最快的吞吐量。我可以容忍潛在的損失,并已適當(dāng)減輕。我的內(nèi)存映射數(shù)據(jù)是文件備份數(shù)據(jù)......如果我檢測到丟失,一旦硬件錯誤被清除,我可以檢測并重新備份丟失的數(shù)據(jù)。

顯然,文件系統(tǒng)必須足夠可靠才能運(yùn)行數(shù)據(jù)庫應(yīng)用程序,但我不知道有任何供應(yīng)商建議您仍然不需要備份。壞事發(fā)生。計(jì)劃損失。我做的一件事是我從不寫入數(shù)據(jù)中間。我的數(shù)據(jù)是不可變的和版本化的,每個“數(shù)據(jù)”文件限制為 2gb,但每個應(yīng)用程序采用不同的策略。


查看完整回答
反對 回復(fù) 2022-07-23
?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗(yàn) 獲得超8個贊

NTFS 文件系統(tǒng)(和 ext3-4)使用事務(wù)日志來操作更改。每個更改都存儲在日志中,然后日志本身用于有效地執(zhí)行更改。除了災(zāi)難性的磁盤故障外,文件系統(tǒng)被設(shè)計(jì)為在其自己的數(shù)據(jù)結(jié)構(gòu)中保持一致,而不是您的:在崩潰的情況下,恢復(fù)過程將決定回滾什么以保持一致性。在回滾的情況下,您的“尚未寫入但要寫入”的數(shù)據(jù)將丟失。文件系統(tǒng)將是一致的,而您的數(shù)據(jù)則不是。

此外,還涉及其他幾個因素:軟件和硬件緩存引入了一個額外的層,因此是一個故障點(diǎn)。通常操作是在緩存中執(zhí)行的,然后緩存本身會刷新到磁盤上。文件系統(tǒng)驅(qū)動程序不會看到“在”緩存中執(zhí)行的操作,但我們會看到刷新操作。這樣做是出于性能原因,因?yàn)橛脖P是瓶頸。硬件控制器確實(shí)有電池,以保證即使在斷電的情況下也可以刷新自己的緩存。

扇區(qū)的大小是另一個重要因素,但不應(yīng)考慮此細(xì)節(jié),因?yàn)槌鲇诨ゲ僮餍阅康?,硬盤驅(qū)動器本身可能與其原始大小有關(guān)。

如果你有一個 mewmory 映射并且你在中間插入數(shù)據(jù),當(dāng)電源關(guān)閉時,如果文件的內(nèi)容超過了內(nèi)部緩沖區(qū)的大小,則文件的內(nèi)容可能部分包含你所做的更改。

TxF 是一種緩解問題的方法,但有幾個影響限制了您可以使用它的上下文:例如,它不適用于不同的驅(qū)動器或共享網(wǎng)絡(luò)。

為了成為 ACID,你需要設(shè)計(jì)你的數(shù)據(jù)結(jié)構(gòu)和/或你使用它的方式,以免依賴于實(shí)現(xiàn)細(xì)節(jié)。例如,Mercurial(版本控制工具)總是將自己的數(shù)據(jù)附加到自己的修訂日志中。有許多可能的模式,但是,您需要的保證越多,您獲得的技術(shù)就越具體(并且與之相關(guān))。


查看完整回答
反對 回復(fù) 2022-07-23
  • 2 回答
  • 0 關(guān)注
  • 181 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號