Я пытаюсь записать большой объем данных в набор данных h5, используя следующий набор строк:
fpath = '/run/user/1002/gvfs/smb-share:server=path.to.server,share=Project/data.h5'
hf = h5py.File(fpath,'w')
hf.create_dataset('a', data=a)
dset = hf.create_dataset('b',(nrow,1),maxshape=(nrow,None),chunks=(nrow,1))
for i in range(ncol):
dset[:,-1:] = b
if i+1 < ncol:
dset.resize(dset.shape[1]+1,axis=1)
hf.close()
Файл в расположении fpath
находится в общей папке и доступен по протоколу SMB через Samba. Здесь a
и b
- это массивы (dtype=float)
фигур (nrow,)
и (nrow,ncol)
, где nrow = ~15000
и ncol = ~50000
. Когда я запускаю свой код, я получаю следующую ошибку:
OSError: Ошибка записи драйвера (запись файла не удалась: время = среда
1 мая 14:43:22 2019, имя файла =
«/Run/user/1002/gvfs/smb-share:server=path.to.server,
share = Project / data.h5 ', дескриптор файла = 11, errno = 95, ошибка
message = 'Операция не поддерживается', buf = 0x482ff88, общая запись
размер = 124500, байты этой подзаписи = 124500, байты на самом деле
записано = 18446744073709551615, смещение = 10879697965)
Если я печатаю счетчик цикла print(i)
, я вижу, что цикл достиг конца, поэтому ошибка могла появиться в строке hf.close()
.
Я думаю разбить файлы на несколько небольших файлов. Есть ли другой способ обойти эту ошибку?
Дополнительная информация:
Operating system Ubuntu 16.04.5 LTS
Python v 3.5.2
h5py v 2.9.0
HDF5 (h5cc -showconfig) v 1.8.16
sys.maxsize 9223372036854775807
UPDATE:
Я заменил операцию resize
над набором данных, сначала сохранив полные данные в массивном массиве, а затем записав все массивы в набор данных за один вызов create_dataset
. Позже я столкнулся с другой проблемой, связанной с размером массива numpy, и мне пришлось уменьшить ncol
вдвое и записать данные в два этапа.
Было бы хорошо, если бы ошибка могла быть устранена для итеративного изменения размера набора данных.