gpt4 book ai didi

c++ - 使用 Boost 的 file_mapping 和 mapped_region 最小化内存使用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:28:58 24 4
gpt4 key购买 nike

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

我是内存映射文件 i/o 领域的新手,想知道如何最好地对文件进行分段以减少内存使用量。创建缩小区域(例如每个 Z 平面)会改善结果吗?我想在不造成不利影响的情况下使用尽可能少的内存。

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

最佳答案

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

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;
}

当被要求在我的 8GB RAM 机器上读取 12GB 文件时,我看到了你描述的效果(我进程的资源监视器内存数据:提交 25 MB,私有(private) 20 MB,工作集和可共享 6.5 GB我的可用 RAM 的数量)。然而,互联网上的多个消息来源说这些数字没有任何意义并且不会影响性能,因为只要任何进程请求更多内存,未使用的物理页面就会被丢弃,而且这个过程非常便宜(当然除非你正在写你的内存映射文件)。

或者,如果您真的对此行为不满意,您可以通过调用 VirtualUnlock 自行释放未使用的部分,如下所述:https://stackoverflow.com/a/1882478/126995

或者,您可以只映射您需要的文件部分。

但您能做的最好的事情就是优化您的数据布局。如果在您的数据文件中您将体素保存为 double voxels[x][y][z],请将它们存储为 struct { double voxels[8][8][8] } block [x/8][y/8][z/8] 代替。这样, block 大小正好是 4kb,这是一个页面大小,如果您只需要访问,例如XZ 平面,您将节省很多 的 I/O 带宽,数量级。只是不要搞砸了错位,即如果您在数据之前有一个标题,请确保标题的大小为 4kb*n,其中 n 是整数。

关于c++ - 使用 Boost 的 file_mapping 和 mapped_region 最小化内存使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14903474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com