2015-10-16 70 views
0

我有一個文本文件正在被一個程序併發寫入,並被另一個程序讀取。文件本身是一堆鍵 - 值對,其中每一對都在它自己的行上,並且鍵和值由空白分隔。我已經將文件映射到兩個程序的內存中(使用MAP_SHARED標誌),並且當新的用戶提供的鍵值對的關鍵字已經成功地將需要寫入該文件的程序非常有效地寫入到該程序在文件中不存在。覆蓋mmapped文件中間數據的有效方法

我現在正在努力的是,當用戶輸入新的鍵值對並且文件中已存在該鍵時,高效地覆蓋與鍵關聯的值。

當新值與原始值相同或更少時,我可以簡單地覆蓋映射地址處的值,我不必擔心重新映射和映射。然而,當新值大於先前值時,是否有一種有效的方法來處理這個問題?剛剛騰出5個數字鍵和10個數字的值 -

感謝

+3

你不能那樣做。您可能要考慮使用適當的數據庫。 –

+0

我很喜歡,但項目的約束更多的是練習,它是兩個程序同時讀寫一個文件,文件存儲鍵值對,一個程序可以添加/編輯這些鍵值對,值對,另一個程序可以簡單地檢索與文件中存在的鍵相關的值。本質上是一個生活在文件中的concurreny友好散列圖。 –

+0

@AlexanderBolinsky Dude它的一個任務的地獄..我的意思是你想要做的是一個非常大的辯論在CS或數據庫世界。 – Minato

回答

1

因爲項和值已經讓你不需要可變長度的線限制值,你可以墊他們。

那麼當然,你有問題保證存儲器映射區域是同步的,以及如何避免競爭條件。例如,posix似乎沒有提供任何其他(讀者)程序在寫入和msync調用之間看到的內容。

您將不得不在文件中添加一些同步信息。這可以通過確保在更新期間該值無效來完成。例如,使用零填充值並將5作爲第一個數字可用作指示該值正在更新。你必須小心,儘管不要擔保不能保證的事情。