2015-08-08 101 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