Как использовать h5py для доступа к нескольким файлам HDF5, хранящимся на общих дисках Google? Данные в разных файлах в Python выглядят одинаково.

Я пытаюсь использовать h5py для доступа (чтения / записи / копирования) к нескольким файлам HDF5, которые хранятся на общем диске Google. Я использую Google File Stream, и мой общий диск Google отображается в проводнике как подключенный диск (G :). Кроме того, я выбрал опцию, чтобы мои файлы были доступны офлайн.

Я могу читать и записывать отдельные файлы HDF5 на мой общий диск Google и с него, если в h5py одновременно открыт только один файл. Однако, если у меня одновременно открыто несколько файлов в h5py, то внутренняя структура (группы, наборы данных и данные) в каждом файле HDF5 (читаемом h5py) выглядит идентично первому открытому мной файлу.

Вот пример, демонстрирующий мою проблему. Сначала давайте создадим два простых файла HDF5 на общем диске Google:

from pathlib import Path
import h5py

# Set up path and filenames
folder = Path(r'G:\Team Drives\Shared Drive')
filename1 = folder / 'file1.h5'
filename2 = folder / 'file2.h5'

# Create first HDF5 file
h5file1 = h5py.File(filename1, 'a')
h5file1.create_dataset('data1', data=1)
h5file1.close()

# Create second HDF5 file
h5file2 = h5py.File(filename2, 'a')
h5file2.create_dataset('data2', data=2)
h5file2.close()

Затем давайте откроем файлы HDF5 по одному и напечатаем имена наборов данных в каждом файле:

h5file1 = h5py.File(filename1, 'r')
print(f'{h5file1}: datasets = {list(h5file1.keys())}')
h5file1.close()
h5file2 = h5py.File(filename2, 'r')
print(f'{h5file2}: datasets = {list(h5file2.keys())}')
h5file2.close()

Результат:

<HDF5 file "file1.h5" (mode r)>: datasets = ['data1']
<HDF5 file "file2.h5" (mode r)>: datasets = ['data2']

чего я и ожидал. Теперь давайте откроем оба файла HDF5 одновременно и снова напечатаем имена наборов данных в каждом файле:

h5file1 = h5py.File(filename1, 'r')
h5file2 = h5py.File(filename2, 'r')
print(f'{h5file1}: datasets = {list(h5file1.keys())}')
print(f'{h5file2}: datasets = {list(h5file2.keys())}')
h5file1.close()
h5file2.close()

Теперь результат:

<HDF5 file "file1.h5" (mode r)>: datasets = ['data1']
<HDF5 file "file2.h5" (mode r)>: datasets = ['data1']

Несмотря на то, что дескрипторы файлов указывают на то, что они указывают на разные имена файлов, h5py считывает внутреннюю структуру данных (группы, наборы данных и данные) обоих файлов как идентичную первому открытому файлу.

Хотя я могу открывать один файл за раз, если я читаю файлы, это становится проблемой, если я хочу скопировать набор данных из существующего файла в новый файл. Например, давайте попробуем скопировать набор данных data1 из file1 в новый файл:

filename3 = folder / 'file3.h5'
h5file3 = h5py.File(filename3, 'a')
h5file1 = h5py.File(filename1, 'r')
h5file1.copy('data1', h5file3)

Это вызывает следующую ошибку:

KeyError: "Unable to open object (object 'data1' doesn't exist)"

потому что файл1 был открыт после файла3, а файл3 не содержит набора данных 'data1'. Если я вместо этого открою file1 перед file3, то получу:

OSError: Unable to create file (file exists)

Единственный обходной путь, который я смог использовать до сих пор, - сначала создать file3 на моем локальном диске (C :), скопировать набор данных из file1 в file3, закрыть оба файла, а затем переместить file3 на общий диск Google.

Я нашел эти сообщения на форуме (Python HDF5 H5Py проблемы с открытием нескольких файлов и озадачивающее поведение присваивания с объектом h5py в качестве переменной экземпляра) в котором обсуждалась аналогичная проблема, когда одно и то же имя переменной Python было переназначено другой переменной экземпляра файла h5py. Однако я думаю, что моя проблема в другом, потому что я использую уникальные имена переменных, и в ответе на один из вопросов говорится, что Проблема может быть решена с помощью h5py 2.0 или выше (я использую h5py 2.9.0).

Я также прочитал сообщение в блоге HDF в облаке, в котором говорится, что существуют проблемы с доступом к файлам HDF5 в облаке, если вы не можете убедить свою операционную систему в том, что облако является нормальной файловой системой. Однако я подумал, что это можно сделать с помощью Google File Stream, поскольку он установлен как мой диск G :.

Могу ли я что-то не понять о h5py или о том, как монтируется мой общий диск Google? Есть ли у меня способ использовать h5py для доступа к нескольким файлам HDF5 на общем диске Google?

Примечание. Я использую Python 3.7 и h5py 2.9.0 на 64-битной машине с Windows 10.


person Shane L    schedule 28.02.2019    source источник