如何在 GDAL ruby​​ 绑定中显式关闭数据集?

Posted

技术标签:

【中文标题】如何在 GDAL ruby​​ 绑定中显式关闭数据集?【英文标题】:How to explicitly close datasets in GDAL ruby binding? 【发布时间】:2012-11-22 09:24:35 【问题描述】:

我正在使用来自 ruby​​1.9 的 GDAL 1.7.1 来生成 GeoTIFF 文件。在tutorial 中,他们建议使用 GDALClose() 关闭数据集并将任何剩余内容刷新到文件系统。同样的情况也发生在数据集的析构函数中。问题是 ruby​​ 绑定依赖于这种析构机制来关闭数据集,我需要文件的结果已经在生成它的过程中。由于 ruby​​ 是垃圾收集的,因此如果不退出 ruby​​ 进程,我似乎无法可靠地关闭我的文件。现在我修补了我的 GDAL 版本以支持 GDALClose 方法,但这似乎不是一个好的长期解决方案。

require 'gdal/gdal'

[...]

# open the driver for geotiff format
driver = Gdal::Gdal.get_driver_by_name('GTiff')
# create a new file
target_map = driver.create(output_path,
                xsize,
                ysize, 3,
                Gdal::Gdalconst::GDT_UINT16, ["PHOTOMETRIC=RGB"])

# write band data
3.times do |i|
    band = target_map.band(i + 1)
    target_map.write_band(i + 1, mapped_data)
end

# now I would like to use the file in output_path, but at this point 
# large parts of the data still resides in memory it seems until 
# target_map is destroyed

file = File.open( output_path, "r" )

[...]

在 ruby​​ 或 swig 中是否有什么东西可以强制调用析构函数,我可能忽略了?

【问题讨论】:

显示一小段代码示例来说明问题。您要求我们将您所写的内容可视化,而我们无法做到这一点。 【参考方案1】:

通常在 Python 中对 GDAL 绑定所做的是将对象设置为 None。所以在 Ruby 中,这将是 nil:

band = nil
target_map = nil

这是一种保存/刷新/关闭数据的有趣方式,但它就是这样做的。

【讨论】:

这不适用于 Ruby。 Python 是引用计数的,因此一旦取消设置所有引用,对象就会被删除。 Ruby 是垃圾收集器,因此将变量设置为 nil 是不够的。有人可能认为这样做并调用 GC.start 会起作用,但这是不可靠的。 Ruby GC扫描C栈查找对象引用,很有可能GDAL对象还躺在那里。

以上是关于如何在 GDAL ruby​​ 绑定中显式关闭数据集?的主要内容,如果未能解决你的问题,请参考以下文章

私有成员是不是应该在惯用的 C# 中显式声明为私有? [关闭]

在 C++ 中显式删除移动构造函数的用例 [关闭]

如何在 Spring Boot 配置中显式传递数据库名称?

如何在 CoffeeScript 中显式返回对象

如何在 Django 中显式重置模板片段缓存?

如何在opencv中显式访问mjpeg后端进行视频捕获