python - 如何限制python GDAL VRT读取的RAM使用
问题描述
在使用 python gdal 库读取 VRT 区域时,RAM 使用量不断增加,最多可达可用内存的 50%。这在普通计算机上很好,但在具有大量可用 RAM 的计算集群上运行时会成为问题。
有没有办法限制 gdal 使用多少 RAM?
编辑:
我一次读取 256x256 像素的块,这些块vrt.ReadAsArray(...)
立即使用,之后不再需要。但是,从内存消耗来看,gdal 将读取的切片保留在内存中,以防再次需要它们,直到可用内存被填充约 50%。只有这样它才会开始从 RAM 中删除未使用的图块。无论我在什么硬件上运行程序,内存消耗都会随着时间的推移而不断增加,直到达到 50% 标记。
我想将其限制为 32Gb RAM 之类的东西。
我找到了CHACHE_MAX
gdal 的配置选项。但是,在检查已使用缓存的数量时,gdal.GetCacheUsed()
它显然始终为 0。因此,虽然该选项听起来很有希望,但这似乎并没有提供解决方案。
解决方案
我终于做了一些测试并找到了解决方案,以防其他人遇到这个问题。
虽然gdal.GetCacheUsed()
总是返回 0,但更改CACHE_MAX
配置选项为我解决了这个问题。这可以像这样在python中设置:
from osgeo import gdal
gdal.SetCacheMax(134217728) # 134Mb
虽然我无法弄清楚这个限制究竟是如何应用的,但缓存大小似乎是每个波段、VRT 中的每个光栅、每个 VRT、每个进程。也就是说,具有许多栅格和波段等的 VRT 的内存使用率会更高。
推荐阅读
- android - 使用 volley 在服务器中上传 csv 文件的问题
- sql-server - 无法使用 ADO 在 MS SQL Express 服务器上开始事务
- bash - 未知速记标志:-d 中的 'd'
- react-day-picker - 每天显示 2 个日历(格鲁吉亚语和回历)
- android - Android WebView 支持 WebAuthn?
- azure - 如何通过终端(脚本)而不是从门户将 api 导入/添加到 azure 中的 apim?
- jquery - 如何使用 JQuery .append() 方法添加包含 html 的字符串?
- hibernate - org.springframework.data.util.Pair 类型的目标 bean 不是持久实体的类型 (com.mycompany.hibernatepoc.ConnectionManager
- javascript - 缩短一个大字符串而不削减单词并在Javascript中保存到数组中
- c# - ObservableCollection 的 Notifychange 属性