2015-08-08 104 views
0

我目前使用Boost.Iostreams來映射多個文件以寫出非常大的數據集。要寫入的數據量因保證不會超出預定義的限制而有所不同。通常使用映射文件的全部容量,但有時不是,僅寫入非常少的部分。截斷內存映射文件

我的問題是,我不知道要寫入的數據量,所以每個內存映射文件都是以相同的大小創建的。因此,該程序效率較低,因爲尚未使用完整容量的文件在關閉時不會被填滿。

有沒有在關閉之前使用Boost.Iostreams或其他跨平臺庫(最好是boost)截斷文件的方法?

我知道還有其他類似的問題,但我不相信他們提供了跨平臺解決方案。

回答

0

您可以使用truncate(2)ftruncate(2)系統調用截斷現有文件的大小。

注意,在使用應munmap()文件,在截斷之前,如果你查看mmap(2)手冊頁的內容,它記錄了一個截斷MMAP-ED文件是不確定的行爲。

但是,在截斷文件之前,不應該破壞任何規則。

+0

感謝您的信息,但這些工作將使用Boost.Iostreams目前映射的文件?我真的在跨平臺解決方案後,但如果這是兼容的,那麼我可以寫一個Windows的_chsize包裝。 – josh247

+0

我對Boost庫不熟悉。 truncate()適用於任何常規打開的文件描述符。你將不得不做任何需要做的事情來取消映射文件。我確信Boost必須爲您提供獲取底層文件描述符的方法。 –

+0

看起來好像只了Boost.Iostreams支持固定大小的內存映射文件,並不能給出一個文件描述符。我將不得不使用mmap,mumap和ftruncate編寫一個包裝器來處理unix和windows系統上的事情。謝謝您的幫助。 – josh247