C++ 使用Boost'最大限度地减少内存使用;s文件\u映射和映射\u区域?

C++ 使用Boost'最大限度地减少内存使用;s文件\u映射和映射\u区域?,c++,memory-management,boost,file-io,C++,Memory Management,Boost,File Io,对于这个问题,我正在将一个大的三维体积从文件加载到一个程序中,但通常一次只需要查看三个平面(x,y,z)。我目前正在使用Boost::Interprocess::File_映射来创建文件的映射(32 GB),并将其加载到具有24 GB RAM的系统中。当前方法为文件使用单个Boost::Interprocess::Mapped_区域。内存使用率迅速接近99% 我是内存映射文件I/o的新手,想知道如何最好地分割文件以减少内存使用量。创建缩小尺寸的区域(例如每个Z平面)会改善结果吗?我希望尽可能少地

对于这个问题,我正在将一个大的三维体积从文件加载到一个程序中,但通常一次只需要查看三个平面(x,y,z)。我目前正在使用Boost::Interprocess::File_映射来创建文件的映射(32 GB),并将其加载到具有24 GB RAM的系统中。当前方法为文件使用单个Boost::Interprocess::Mapped_区域。内存使用率迅速接近99%

我是内存映射文件I/o的新手,想知道如何最好地分割文件以减少内存使用量。创建缩小尺寸的区域(例如每个Z平面)会改善结果吗?我希望尽可能少地使用内存而不会造成不良影响


我这样做是正确的,还是有更直接的方法来执行此操作?

在Windows上,它通常工作正常。我创建了一个测试应用程序(很抱歉,我讨厌boost,因为我认为它的质量令人震惊,我的示例使用ATL,但底层的Windows API是相同的):

HRESULT TestMain(LPCTSTR strFileName)
{
CAtlFile文件;
HRESULT hr=file.Create(strFileName、GENERIC\u READ、file\u SHARE\u READ、OPEN\u EXISTING);
如果(失败(小时))
返回人力资源;
CAtlFileMapping;
hr=mapping.MapFile(文件);
如果(失败(小时))
返回人力资源;
size_t sz=mapping.GetMappingSize();
字节res=0;
对于(大小i=0;i
当我被要求用8GB RAM在我的机器上读取12GB文件时,我看到了您所描述的效果(我的进程的资源监视器内存数据:提交25MB,私有20MB,工作集和可共享6.5GB,这是我的空闲RAM)。然而,互联网上的多个消息来源说,这些数字没有任何意义,也不会影响性能,因为一旦任何进程请求更多内存,未使用的物理页就会被丢弃,而且这个进程非常便宜(当然,除非您正在写入内存映射文件)

或者,如果您真的对此行为不满意,您可以通过调用VirtualUnlock自己释放未使用的部分,如下所述:

或者,您只能映射所需文件的部分


但是你能做的最好的事情就是优化数据的布局。如果在数据文件中,将体素保留为
双体素[x][y][z]
,则将其存储为
结构{double voxels[8][8][8]}块[x/8][y/8][z/8]
。这样,块大小正好是4kb,这是一个页面大小,如果您只需要访问例如XZ平面,您将节省大量的I/O带宽(数量级)。只是不要搞乱未对齐的问题,即如果在数据之前有一个标题,请确保标题的大小为4kb*n,其中n为整数。

您忘记指定平台。我没有指定平台,因为该概念是独立设计的。我正在Windows上调试,但是我应该包括它。谢谢你的反馈。我知道布局可以改善情况,但不知道我的结果是否符合预期。我可能会尝试使用本机内存映射,因为我也讨厌使用Boost。
HRESULT TestMain( LPCTSTR strFileName )
{
    CAtlFile file;
    HRESULT hr = file.Create( strFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING );
    if( FAILED( hr ) )
        return hr;
    CAtlFileMapping<BYTE> mapping;
    hr = mapping.MapFile( file );
    if( FAILED( hr ) )
        return hr;
    size_t sz = mapping.GetMappingSize();
    BYTE res = 0;
    for( size_t i = 0; i < sz; i++ )
        res ^= mapping[ i ];

    printf( "Read the complete file, %Iu bytes, the XOR is %.2X\n", sz, int( res ) );
    return S_OK;
}