4

ruby1.9 のGDAL 1.7.1 を使用して GeoTIFF ファイルを生成しています。チュートリアルでは、GDALClose() を使用してデータセットを閉じ、残りのコンテンツをファイル システムにフラッシュすることを推奨しています。データセットのデストラクタでも同じことが起こります。問題は、Ruby バインディングがこのデストラクタ メカニズムに依存してデータセットを閉じることであり、それを生成するプロセスで既にファイルの結果が必要です。ruby はガベージ コレクションであるため、ruby プロセスを終了しないとファイルを確実に閉じることができないようです。今のところ、GDALClose メソッドをサポートするために自分のバージョンの GDAL にパッチを適用しましたが、これは長期的には良い解決策ではないようです。

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" )

[...]

ルビーまたはスウィグのいずれかに、デストラクタの呼び出しを強制する何かがありますが、それは私が見落としている可能性がありますか?

4

1 に答える 1

1

通常、Python で GDAL バインディングを使用して行うことは、オブジェクトを に設定することNoneです。したがって、Ruby では次のようになりますnil

band = nil
target_map = nil

データを保存/フラッシュ/閉じるのは面白い方法ですが、それがどのように行われるかです。

于 2012-12-04T02:51:35.877 に答える