user1474341
user1474341

Reputation: 155

Boost interprocess creating memory mapped file > 4GB

When I try to create a memory mapped file using boost interprocess managed_mapped_file of size > 4GB, a smaller file is created (e.g. if a 5GB specification results in a 1GB file).

#include <iostream>
#include <string>

#include <boost/interprocess/managed_mapped_file.hpp>

int main()
{
   unsigned int sizeInMB = 4 * 1024 - 1;
   boost::interprocess::managed_mapped_file file1(boost::interprocess::create_only, "MyMappedFile1", sizeInMB * 1024 * 1024);
   std::cout << "Free memory File 1 = " << file1.get_segment_manager()->get_free_memory() << std::endl;

   sizeInMB = 5 * 1024;
   boost::interprocess::managed_mapped_file file2(boost::interprocess::create_only, "MyMappedFile2", sizeInMB * 1024 * 1024);
   std::cout << "Free memory File 2 = " << file2.get_segment_manager()->get_free_memory() << std::endl;
}

The output here is -

Free memory File 1 = 4293918496
Free memory File 2 = 1073741600

How can I create a file larger than 4 GB?

Thanks.

Upvotes: 1

Views: 79

Answers (1)

sehe
sehe

Reputation: 393694

The wrapping happens because you use int, instead of size_t:

#include <iostream>
#include <string>

#include <boost/interprocess/managed_mapped_file.hpp>

int main()
{
   size_t sizeInMB = 4 * 1024 - 1;
   boost::interprocess::managed_mapped_file file1(boost::interprocess::create_only, "MyMappedFile1", sizeInMB * 1024 * 1024);
   std::cout << "Free memory File 1 = " << file1.get_segment_manager()->get_free_memory() << std::endl;

   sizeInMB = 5 * 1024;
   boost::interprocess::managed_mapped_file file2(boost::interprocess::create_only, "MyMappedFile2", sizeInMB * 1024 * 1024);
   std::cout << "Free memory File 2 = " << file2.get_segment_manager()->get_free_memory() << std::endl;
}

Printing

Free memory File 1 = 4293918496
Free memory File 2 = 5368708896

Upvotes: 0

Related Questions