【问题标题】:Truncating a memory mapped file截断内存映射文件
【发布时间】:2015-11-01 04:38:40
【问题描述】:

我目前正在使用 Boost.Iostreams 来内存映射多个文件以写出非常大的数据集。要写入的数据量因保证不会超过预定义的限制而异。通常会使用映射文件的全部容量,但有时不会,只写入很小的一部分。

我的问题是我事先不知道要写入的数据量,因此每个内存映射文件都是以相同大小创建的。结果,程序效率较低,因为在关闭时未使用满容量的文件为零。

有没有办法在关闭之前使用 Boost.Iostreams 或其他跨平台库(最好是 boost)截断文件?

我知道还有其他类似的问题,但我不相信他们提供跨平台解决方案。

【问题讨论】:

    标签: c++ file memory boost


    【解决方案1】:

    您可以使用truncate(2) 或ftruncate(2) 系统调用来截断现有文件的大小。

    注意,在截断之前,应该使用munmap() 文件。如果您查看mmap(2) 手册页的内容,它记录了截断 mmap 文件是未定义的行为。

    但是,在截断文件之前munmap()ing 文件不应违反任何规则。

    【讨论】:

    • 感谢您的信息,但这些是否适用于当前使用 Boost.Iostreams 映射的文件?我真的很喜欢跨平台解决方案,但如果这是兼容的,那么我可以用 _chsize for windows 编写一个包装器。
    • 我对 Boost 库不熟悉。 truncate() 适用于任何定期打开的文件描述符。您必须做任何需要做的事情才能取消映射文件。我确信 Boost 必须为您提供获取底层文件描述符的方法。
    • 看起来好像 Boost.Iostreams 只支持固定大小的内存映射文件,不能给出文件描述符。我必须编写一个包装器来使用 mmap、mumap 和 ftruncate 在 unix 和 windows 系统上处理事情。感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 2010-11-01
    • 2011-05-14
    • 2016-12-08
    • 2010-09-26
    相关资源
    最近更新 更多