Mengapa menutup dataset dalam GDAL Python?


17

Saya cukup sering melihat dalam kode Python GDAL bahwa orang menutup dataset di akhir skrip mereka. Mengapa masuk akal untuk menutup dataset dengan Python GDAL? Adakah konsekuensi jika saya tidak melakukannya?

import gdal

# open dataset
ds = gdal.Open('test.tif')

# close dataset
ds = None

Kadang-kadang destruktor C ++ melakukan hal-hal selain membersihkan (untuk beberapa driver), seperti mengkompilasi ulang statistik. Ini praktik yang baik untuk diatur ke Tidak ada, semua yang dikatakan bla238 benar juga AFAIK.

Jawaban:


15

Saya tidak berpikir ini memiliki tujuan apa pun di akhir skrip, karena pemulung sampah Python akan melakukan hal yang sama secara otomatis ketika skrip keluar. Alasan Anda mungkin ingin melakukannya adalah di tengah skrip Anda, untuk memulihkan sumber daya yang dimiliki dengan mengakses dataset, menghapus kunci file, dll. Sehingga Anda dapat menggunakannya kembali.

del ds harus memiliki efek yang sama tetapi lebih jelas untuk maksudnya.

Pendekatan yang lebih Pythonic akan menggunakan withpernyataan , tetapi GDAL / OGR tidak mengimplementasikannya. Namun, ada beberapa pembungkus GDAL / OGR seperti Rasterio dan Fiona yang melakukannya.


2
Pertimbangkan objek file Python. Anda membuka satu dengan f = open(filename)dan Anda menutup satu dengan f.close(). Tidak del fatau f = None. Mengapa? Karena apa yang terjadi pada objek setelah mereka tidak lagi direferensikan adalah detail dari implementasi penerjemah dan karena eksplisit lebih baik daripada implisit ( python.org/dev/peps/pep-0020 ).
sgillies

1
Setuju, tetapi binding GDAL Python tidak sepenuhnya Pythonic. Ada GDALClose()metode yang harus dipanggil jika Anda ingin eksplisit (saya melihat bahwa Rasterio menyebutnya secara internal ).
blah238

2
Dalam Python, GDALClose()belum diimplementasikan tetapi pengaturan dataset ke None(yaitu, ds = None) adalah setara.
Arthur
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.