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

4

我正在使用GDAL 1.7.1从ruby1.9生成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 中强制调用析构函数的方法,我可能忽略了什么?

展示一小段代码,说明问题所在。你要求我们想象你所写的代码,但我们无从得知。 - the Tin Man
1个回答

1
通常在Python中使用GDAL绑定时,会将对象设置为None。因此,在Ruby中,这将是nil
band = nil
target_map = nil

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


4
对于Ruby不起作用。Python是基于引用计数的,所以只要所有引用都被取消,对象就会被删除。Ruby是垃圾回收的,所以将变量设置为nil是不够的。有人可能认为这样做并调用GC.start会起作用,但这是不可靠的。Ruby GC扫描C堆栈以查找对象引用,很可能GDAL对象仍然存在其中。 - sylvain.joyeux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接