Закрытие файлов с помощью функции dask from_array - PullRequest
1 голос
/ 28 февраля 2020

Мне довелось использовать метод Даска "from_array". Как и в документах на https://docs.dask.org/en/latest/array-creation.html, я делаю следующее:

>>> import h5py
>>> f = h5py.File('myfile.hdf5') # HDF5 file
>>> d = f['/data/path']          # Pointer on on-disk array
>>> x = da.from_array(d, chunks=(1000, 1000))

Но согласны ли вы в этом примере с тем, что мне следует закрыть файл hdf5 после обработки данных?

Если да, может быть полезно добавить в массив Dask функцию, позволяющую просто передать указатель файла и ключ набора данных, чтобы включить в массив Dask подпрограмму, которая закрывает исходный файл, если таковой имеется Когда объект массива dask уничтожен.

Я знаю, что хороший способ продолжить будет выглядеть так:

>>> import h5py
>>> with h5py.File('myfile.hdf5') as f: # HDF5 file
>>>     d = f['/data/path']          # Pointer on on-disk array
>>>     x = da.from_array(d, chunks=(1000, 1000))

Но иногда это не очень удобно. Например, в моем коде у меня есть функция, которая возвращает массив dask из пути к файлу с некоторыми проверками работоспособности между ними, примерно так:

>>> import h5py
>>> function get_dask_array(filepath, key)
>>>     f = h5py.File(filepath) # HDF5 file
>>>     # ... some sanity checks here
>>>     d = f[key] # Pointer on on-disk array
>>>     # ... some sanity checks here
>>>     return da.from_array(d, chunks=(1000, 1000))

В этом случае я считаю уродливым возвращать а также указатель файла и держите его в стороне на время обработки, прежде чем закрывать его.

Есть предложения о том, как мне поступить?

Заранее благодарю за ответы,

С уважением,

Редактировать: сейчас я использую глобальные переменные внутри пакета следующим образом:

@atexit.register
def clean_files():
    for f in SOURCE_FILES:
        if os.path.isfile(s):
            f.close()
...