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

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

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

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

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

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

OSError: Unable to create file (file exists)

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

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

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

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

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

0 ответов

Другие вопросы по тегам